Full Code of CrabMen/CMPageTitleView for AI

master 0abf0460d618 cached
161 files
552.9 KB
163.4k tokens
11 symbols
1 requests
Download .txt
Showing preview only (623K chars total). Download the full file or copy to clipboard to get everything.
Repository: CrabMen/CMPageTitleView
Branch: master
Commit: 0abf0460d618
Files: 161
Total size: 552.9 KB

Directory structure:
gitextract_ict2499d/

├── .gitignore
├── CMPageTitleView/
│   ├── CMPageTitleView/
│   │   ├── Class/
│   │   │   ├── CMPageContentView.h
│   │   │   ├── CMPageContentView.m
│   │   │   ├── CMPageTitleConfig.h
│   │   │   ├── CMPageTitleConfig.m
│   │   │   ├── CMPageTitleContentView.h
│   │   │   ├── CMPageTitleContentView.m
│   │   │   ├── CMPageTitleView.h
│   │   │   ├── CMPageTitleView.m
│   │   │   ├── CMPageTitleViewMacro.h
│   │   │   ├── UIView+CMCommon.h
│   │   │   └── UIView+CMCommon.m
│   │   ├── Demo/
│   │   │   ├── CMChildTableController.h
│   │   │   ├── CMChildTableController.m
│   │   │   ├── CMMainTableController.h
│   │   │   ├── CMMainTableController.m
│   │   │   ├── CMViewController.h
│   │   │   └── CMViewController.m
│   │   └── Other/
│   │       ├── AppDelegate.h
│   │       ├── AppDelegate.m
│   │       ├── Assets.xcassets/
│   │       │   ├── AppIcon.appiconset/
│   │       │   │   └── Contents.json
│   │       │   ├── Contents.json
│   │       │   ├── add.imageset/
│   │       │   │   └── Contents.json
│   │       │   └── background_image.imageset/
│   │       │       └── Contents.json
│   │       ├── Base.lproj/
│   │       │   ├── LaunchScreen.storyboard
│   │       │   └── Main.storyboard
│   │       ├── Info.plist
│   │       └── main.m
│   ├── CMPageTitleView.xcodeproj/
│   │   ├── project.pbxproj
│   │   └── project.xcworkspace/
│   │       ├── contents.xcworkspacedata
│   │       └── xcshareddata/
│   │           ├── IDEWorkspaceChecks.plist
│   │           └── WorkspaceSettings.xcsettings
│   ├── CMPageTitleView.xcworkspace/
│   │   ├── contents.xcworkspacedata
│   │   └── xcshareddata/
│   │       ├── IDEWorkspaceChecks.plist
│   │       └── WorkspaceSettings.xcsettings
│   ├── Podfile
│   └── Pods/
│       ├── MJRefresh/
│       │   ├── LICENSE
│       │   ├── MJRefresh/
│       │   │   ├── Base/
│       │   │   │   ├── MJRefreshAutoFooter.h
│       │   │   │   ├── MJRefreshAutoFooter.m
│       │   │   │   ├── MJRefreshBackFooter.h
│       │   │   │   ├── MJRefreshBackFooter.m
│       │   │   │   ├── MJRefreshComponent.h
│       │   │   │   ├── MJRefreshComponent.m
│       │   │   │   ├── MJRefreshFooter.h
│       │   │   │   ├── MJRefreshFooter.m
│       │   │   │   ├── MJRefreshHeader.h
│       │   │   │   └── MJRefreshHeader.m
│       │   │   ├── Custom/
│       │   │   │   ├── Footer/
│       │   │   │   │   ├── Auto/
│       │   │   │   │   │   ├── MJRefreshAutoGifFooter.h
│       │   │   │   │   │   ├── MJRefreshAutoGifFooter.m
│       │   │   │   │   │   ├── MJRefreshAutoNormalFooter.h
│       │   │   │   │   │   ├── MJRefreshAutoNormalFooter.m
│       │   │   │   │   │   ├── MJRefreshAutoStateFooter.h
│       │   │   │   │   │   └── MJRefreshAutoStateFooter.m
│       │   │   │   │   └── Back/
│       │   │   │   │       ├── MJRefreshBackGifFooter.h
│       │   │   │   │       ├── MJRefreshBackGifFooter.m
│       │   │   │   │       ├── MJRefreshBackNormalFooter.h
│       │   │   │   │       ├── MJRefreshBackNormalFooter.m
│       │   │   │   │       ├── MJRefreshBackStateFooter.h
│       │   │   │   │       └── MJRefreshBackStateFooter.m
│       │   │   │   └── Header/
│       │   │   │       ├── MJRefreshGifHeader.h
│       │   │   │       ├── MJRefreshGifHeader.m
│       │   │   │       ├── MJRefreshNormalHeader.h
│       │   │   │       ├── MJRefreshNormalHeader.m
│       │   │   │       ├── MJRefreshStateHeader.h
│       │   │   │       └── MJRefreshStateHeader.m
│       │   │   ├── MJRefresh.bundle/
│       │   │   │   ├── en.lproj/
│       │   │   │   │   └── Localizable.strings
│       │   │   │   ├── ko.lproj/
│       │   │   │   │   └── Localizable.strings
│       │   │   │   ├── ru.lproj/
│       │   │   │   │   └── Localizable.strings
│       │   │   │   ├── uk.lproj/
│       │   │   │   │   └── Localizable.strings
│       │   │   │   ├── zh-Hans.lproj/
│       │   │   │   │   └── Localizable.strings
│       │   │   │   └── zh-Hant.lproj/
│       │   │   │       └── Localizable.strings
│       │   │   ├── MJRefresh.h
│       │   │   ├── MJRefreshConfig.h
│       │   │   ├── MJRefreshConfig.m
│       │   │   ├── MJRefreshConst.h
│       │   │   ├── MJRefreshConst.m
│       │   │   ├── NSBundle+MJRefresh.h
│       │   │   ├── NSBundle+MJRefresh.m
│       │   │   ├── UIScrollView+MJExtension.h
│       │   │   ├── UIScrollView+MJExtension.m
│       │   │   ├── UIScrollView+MJRefresh.h
│       │   │   ├── UIScrollView+MJRefresh.m
│       │   │   ├── UIView+MJExtension.h
│       │   │   └── UIView+MJExtension.m
│       │   └── README.md
│       ├── Masonry/
│       │   ├── LICENSE
│       │   ├── Masonry/
│       │   │   ├── MASCompositeConstraint.h
│       │   │   ├── MASCompositeConstraint.m
│       │   │   ├── MASConstraint+Private.h
│       │   │   ├── MASConstraint.h
│       │   │   ├── MASConstraint.m
│       │   │   ├── MASConstraintMaker.h
│       │   │   ├── MASConstraintMaker.m
│       │   │   ├── MASLayoutConstraint.h
│       │   │   ├── MASLayoutConstraint.m
│       │   │   ├── MASUtilities.h
│       │   │   ├── MASViewAttribute.h
│       │   │   ├── MASViewAttribute.m
│       │   │   ├── MASViewConstraint.h
│       │   │   ├── MASViewConstraint.m
│       │   │   ├── Masonry.h
│       │   │   ├── NSArray+MASAdditions.h
│       │   │   ├── NSArray+MASAdditions.m
│       │   │   ├── NSArray+MASShorthandAdditions.h
│       │   │   ├── NSLayoutConstraint+MASDebugAdditions.h
│       │   │   ├── NSLayoutConstraint+MASDebugAdditions.m
│       │   │   ├── View+MASAdditions.h
│       │   │   ├── View+MASAdditions.m
│       │   │   ├── View+MASShorthandAdditions.h
│       │   │   ├── ViewController+MASAdditions.h
│       │   │   └── ViewController+MASAdditions.m
│       │   └── README.md
│       ├── Pods.xcodeproj/
│       │   └── project.pbxproj
│       └── Target Support Files/
│           ├── MJRefresh/
│           │   ├── MJRefresh-Info.plist
│           │   ├── MJRefresh-dummy.m
│           │   ├── MJRefresh-prefix.pch
│           │   ├── MJRefresh-umbrella.h
│           │   ├── MJRefresh.debug.xcconfig
│           │   ├── MJRefresh.modulemap
│           │   └── MJRefresh.release.xcconfig
│           ├── Masonry/
│           │   ├── Masonry-Info.plist
│           │   ├── Masonry-dummy.m
│           │   ├── Masonry-prefix.pch
│           │   ├── Masonry-umbrella.h
│           │   ├── Masonry.debug.xcconfig
│           │   ├── Masonry.modulemap
│           │   ├── Masonry.release.xcconfig
│           │   └── Masonry.xcconfig
│           ├── Pods-CMPageTitleView/
│           │   ├── Pods-CMPageTitleView-Info.plist
│           │   ├── Pods-CMPageTitleView-acknowledgements.markdown
│           │   ├── Pods-CMPageTitleView-acknowledgements.plist
│           │   ├── Pods-CMPageTitleView-dummy.m
│           │   ├── Pods-CMPageTitleView-frameworks-Debug-input-files.xcfilelist
│           │   ├── Pods-CMPageTitleView-frameworks-Debug-output-files.xcfilelist
│           │   ├── Pods-CMPageTitleView-frameworks-Release-input-files.xcfilelist
│           │   ├── Pods-CMPageTitleView-frameworks-Release-output-files.xcfilelist
│           │   ├── Pods-CMPageTitleView-frameworks.sh
│           │   ├── Pods-CMPageTitleView-umbrella.h
│           │   ├── Pods-CMPageTitleView.debug.xcconfig
│           │   ├── Pods-CMPageTitleView.modulemap
│           │   └── Pods-CMPageTitleView.release.xcconfig
│           ├── Pods-CMPageTitleViewTests/
│           │   ├── Pods-CMPageTitleViewTests-Info.plist
│           │   ├── Pods-CMPageTitleViewTests-acknowledgements.markdown
│           │   ├── Pods-CMPageTitleViewTests-acknowledgements.plist
│           │   ├── Pods-CMPageTitleViewTests-dummy.m
│           │   ├── Pods-CMPageTitleViewTests-frameworks.sh
│           │   ├── Pods-CMPageTitleViewTests-umbrella.h
│           │   ├── Pods-CMPageTitleViewTests.debug.xcconfig
│           │   ├── Pods-CMPageTitleViewTests.modulemap
│           │   └── Pods-CMPageTitleViewTests.release.xcconfig
│           └── Pods-CMPageTitleViewUITests/
│               ├── Pods-CMPageTitleViewUITests-Info.plist
│               ├── Pods-CMPageTitleViewUITests-acknowledgements.markdown
│               ├── Pods-CMPageTitleViewUITests-acknowledgements.plist
│               ├── Pods-CMPageTitleViewUITests-dummy.m
│               ├── Pods-CMPageTitleViewUITests-umbrella.h
│               ├── Pods-CMPageTitleViewUITests.debug.xcconfig
│               ├── Pods-CMPageTitleViewUITests.modulemap
│               └── Pods-CMPageTitleViewUITests.release.xcconfig
├── CMPageTitleView.podspec
├── LICENSE
└── README.md

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
# Xcode

build/
DerivedData/
*.DS_Store
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata/
*.moved-aside
*.xccheckout
*.xcscmblueprint
*.hmap
*.ipa
*.dSYM.zip
*.dSYM
*._*


================================================
FILE: CMPageTitleView/CMPageTitleView/Class/CMPageContentView.h
================================================
//
//  CMPageContentView.h
//  CMDisplayTitleView
//
//  GitHub 下载地址:https://github.com/CrabMen/CMPageTitleView
//

//  Created by CrabMan on 2018/1/15.
//  Copyright © 2018年 Mac. All rights reserved.
//

#import <UIKit/UIKit.h>
#import "CMPageTitleConfig.h"


@class CMPageContentView;
@protocol CMPageContentViewDelegate <NSObject>

@required

/**
 结束拖拽时,即手指离开屏幕时 会调用该代理方法
 @param scrollView 当前操作的scrollView
 @param decelerate 是否是减速
 */
- (void)cm_pageContentViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate;


/**
 减速停止,即结束滚动时 会调用该代理方法

 @param index 结束滚动时,当前的index
 */
- (void)cm_pageContentViewDidEndDeceleratingWithIndex:(NSInteger)index;


/**
 当滚动时调用

 @param progress 0~1 偏移的比例
 @param leftIndex 左侧下标
 @param rightIndex 右侧下标
 */
- (void)cm_pageContentViewDidScrollProgress:(CGFloat)progress LeftIndex:(NSUInteger)leftIndex RightIndex:(NSUInteger)rightIndex;

@end


@interface CMPageContentView : UICollectionView

/**delegate*/
@property (nonatomic,weak) id <CMPageContentViewDelegate> cm_delegate;

/**是否动画*/
@property (nonatomic,assign) BOOL isAniming;

/**
 初始化方法

 @param frame frame
 @param layout layout
 @param config config 用于配置视图
 @return CMPageContentView对象
 */
- (instancetype)initWithFrame:(CGRect)frame collectionViewLayout:(UICollectionViewLayout *)layout Config:(CMPageTitleConfig *)config;


/// 更新layout(不调用scrollViewDidScroll方法)
/// @param layout collectionview 的layout布局
/// @param animated 是否动画
- (void)cm_setCollectionViewLayout:(UICollectionViewLayout *)layout animated:(BOOL)animated;


/// 设置contentOffset(不调用scrollViewDidScroll方法)
/// @param offset 偏移量
- (void)cm_setContentOffset:(CGPoint)offset;

@end




@interface CMFlowLayout : UICollectionViewFlowLayout


@end

@interface CMPageContentCell : UICollectionViewCell


@property (nonatomic,strong) UIView *cm_contentView;


@end


================================================
FILE: CMPageTitleView/CMPageTitleView/Class/CMPageContentView.m
================================================
//
//  CMPageContentView.m
//  CMDisplayTitleView
//
//  GitHub 下载地址:https://github.com/CrabMen/CMPageTitleView
//

//  Created by CrabMan on 2018/1/15.
//  Copyright © 2018年 Mac. All rights reserved.
//

#import "CMPageContentView.h"
@interface CMPageContentView ()<UICollectionViewDelegate,UICollectionViewDataSource>

/**配置*/
@property (nonatomic,strong) CMPageTitleConfig *config;

@property (nonatomic,assign) BOOL scroll;

@property (nonatomic,assign) BOOL isLandscape;

@end

@implementation CMPageContentView


- (instancetype)initWithFrame:(CGRect)frame collectionViewLayout:(UICollectionViewLayout *)layout Config:(CMPageTitleConfig *)config{
    
    if (self = [super initWithFrame:frame collectionViewLayout:layout]) {
        self.config = config;
        self.delegate = self;
        self.dataSource = self;
        [self registerClass:[CMPageContentCell class] forCellWithReuseIdentifier:NSStringFromClass(CMPageContentCell.class)];
        self.pagingEnabled = YES;
        self.showsHorizontalScrollIndicator = NO;
        self.showsVerticalScrollIndicator = NO;
        self.bounces = NO;
        self.scrollEnabled = self.config.cm_slideGestureEnable;
        self.backgroundColor = [UIColor colorWithWhite:1 alpha:0];
        if (self.cm_navigationController && self.config.cm_slideGestureEnable) {
            [self.panGestureRecognizer requireGestureRecognizerToFail:self.cm_navigationController.interactivePopGestureRecognizer];
        }
        
        if (@available(iOS 11.0, *)) {
            self.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
        }
    }
    return self;
}


- (void)cm_setCollectionViewLayout:(UICollectionViewLayout *)layout animated:(BOOL)animated {
    
    __weak typeof(self) weakSelf = self;
    weakSelf.isAniming = YES;
    [UIView animateWithDuration:0.1 animations:^{
        [self setCollectionViewLayout:layout animated:animated completion:nil];
    } completion:^(BOOL finished) {
        weakSelf.isAniming = NO;
    }];
    
    
}

- (void)cm_setContentOffset:(CGPoint)offset {
    self.bounds = CGRectMake(offset.x, offset.y, self.bounds.size.width, self.bounds.size.height);
}

#pragma mark --- UICollectionViewDataSource

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
    
    return 1;
}

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
    
    return self.config.cm_childControllers.count;
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    
    CMPageContentCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:NSStringFromClass(CMPageContentCell.class) forIndexPath:indexPath];
    
    cell.backgroundColor = [UIColor whiteColor];
    
    cell.cm_contentView = [self.config.cm_childControllers[indexPath.row] view];
    [self.config.cm_parentController addChildViewController:self.config.cm_childControllers[indexPath.row]];
    [self.config.cm_childControllers[indexPath.row] didMoveToParentViewController:self.config.cm_parentController];
    
    return cell;
}


#pragma --- UIScrollViewDelegate

-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
    
    if (self.cm_delegate) {
        [self.cm_delegate cm_pageContentViewDidEndDragging:scrollView willDecelerate:decelerate];
    }
}

/**
 scrollView减速完成
 */
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
    
    CGFloat offSetX = scrollView.contentOffset.x;
    NSInteger offSetInx = offSetX;
    NSInteger screenWInt = self.cm_width;
    NSInteger extre = offSetInx % screenWInt;
    
    if (extre > self.cm_width*0.5) {
        //往右边移动
        offSetX = offSetX + (self.cm_width - extre);
        _isAniming = YES;
        [self setContentOffset:CGPointMake(offSetX, 0) animated:YES];
    } else if (extre < self.cm_width * 0.5 && extre > 0){
        _isAniming = YES;
        offSetX = offSetX - extre;
        [self setContentOffset:CGPointMake(offSetX, 0) animated:YES];
    }
    
    NSInteger index = offSetX / self.cm_width;
    
    if (self.cm_delegate) {
        
        [self.cm_delegate cm_pageContentViewDidEndDeceleratingWithIndex:index];
        
    }
}



- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView {
    
    _isAniming = NO;
    
}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if (_isAniming || self.config.cm_childControllers.count == 0) return;
    
    if (self.cm_delegate&&(scrollView.isTracking || scrollView.isDragging || scrollView.isDecelerating)) {
        CGFloat progress = scrollView.contentOffset.x / self.cm_width - floor(scrollView.contentOffset.x / self.cm_width);
        NSUInteger leftIndex = floor(scrollView.contentOffset.x / self.cm_width);
        NSUInteger rightIndex = leftIndex + 1;
        [self.cm_delegate cm_pageContentViewDidScrollProgress:progress LeftIndex:leftIndex RightIndex:rightIndex];
    }
}

@end




@implementation CMFlowLayout

-(void)prepareLayout {
    [super prepareLayout];
    self.minimumInteritemSpacing = 0;
    self.minimumLineSpacing = 0;
    
    if (self.collectionView.bounds.size.height) {
        self.itemSize = self.collectionView.bounds.size;
    }
    self.scrollDirection = UICollectionViewScrollDirectionHorizontal;
}

- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds {
    return  YES;
}

@end

@implementation CMPageContentCell

- (void)setCm_contentView:(UIView *)cm_contentView {
    
    _cm_contentView = cm_contentView;
    _cm_contentView.translatesAutoresizingMaskIntoConstraints = NO;
    
    [self.contentView addSubview:_cm_contentView];
    
    [NSLayoutConstraint activateConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[view]|" options:0 metrics:@{} views:@{@"view":_cm_contentView}]];
    [NSLayoutConstraint activateConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[view]|" options:0 metrics:@{} views:@{@"view":_cm_contentView}]];
}

@end


================================================
FILE: CMPageTitleView/CMPageTitleView/Class/CMPageTitleConfig.h
================================================
//
//  CMPageTitleConfig.h
//  CMPageTitleView
//
//  GitHub 下载地址:https://github.com/CrabMen/CMPageTitleView
//

//  Created by CrabMan on 2019/3/25.
//  Copyright © 2019 CrabMan. All rights reserved.
//

#import <UIKit/UIKit.h>

#import "UIView+CMCommon.h"


NS_ASSUME_NONNULL_BEGIN

typedef NS_ENUM(NSUInteger,CMTitleColorGradientStyle) {
    
    /**颜色无渐变*/
    CMTitleColorGradientStyle_None = 0,
    
    /**rgb颜色渐变*/
    CMTitleColorGradientStyle_RGB = 1,
    
    /**填充色颜色渐变*/
    CMTitleColorGradientStyle_Fill = 2,
    
};

typedef NS_OPTIONS(NSUInteger,CMPageTitleSwitchModeOptions) {
    
    /**字体放大*/
    CMPageTitleSwitchMode_Scale = 1 << 0,
    
    /**下划线样式*/
    CMPageTitleSwitchMode_Underline = 1 << 1,
    
    /**遮罩样式*/
    CMPageTitleSwitchMode_Cover = 1 << 2,
    
    /**滑动切换时延迟,配合其他样式使用*/
    CMPageTitleSwitchMode_Delay = 1 << 3
    

};

typedef NS_OPTIONS(NSUInteger, CMPageTitleAdditionalModeOptions) {
    
    /**标题栏下方的分割线*/
    CMPageTitleAdditionalMode_Seperateline = 1 << 0,
    
    /**标题文字之间的分割线*/
    CMPageTitleAdditionalMode_Splitter = 1 << 1
    
    
};

typedef NS_ENUM(NSUInteger,CMPageTitleContentMode) {
    /**左右边距与标题间距一致*/
    CMPageTitleContentMode_Center,
    
    /**左右边距等于标题间距的一半*/
    CMPageTitleContentMode_SpaceAround,
    
    /**左对齐*/
    CMPageTitleContentMode_Left,
    
    /**右对齐*/
    CMPageTitleContentMode_Right
    
};

typedef NS_ENUM(NSUInteger,CMPageTitleScaleGradientContentMode) {
    /**居中*/
    CMPageTitleScaleGradientContentMode_Center,
    
    /**上对其*/
    CMPageTitleScaleGradientContentMode_Top,
    
    /**下对齐*/
    CMPageTitleScaleGradientContentMode_Bottom,
    
};

@interface CMPageTitleConfig : NSObject
/**
 颜色渐变样式
 默认为 CMTitleColorGradientStyle_RGB
 */
@property (nonatomic,assign) CMTitleColorGradientStyle cm_gradientStyle;

/**
 标题切换样式
 默认为:0,无任何效果
 */
@property (nonatomic,assign) CMPageTitleSwitchModeOptions cm_switchMode;

/**
 标题栏附加样式
 默认为:0 无任何附加效果效果
 */
@property (nonatomic,assign) CMPageTitleAdditionalModeOptions cm_additionalMode;

/**
 对齐方式
默认值:CMPageTitleContentMode_Center
 */
@property (nonatomic,assign) CMPageTitleContentMode cm_contentMode;

/**
 垂直方向上的对齐方式
 只有属性cm_switchMode包含CMPageTitleSwitchMode_Scale下有效果
 默认值:CMPageTitleVerticalContentMode_Center
 */
@property (nonatomic,assign) CMPageTitleScaleGradientContentMode cm_scaleGradientContentMode;


/**子视图控制器数组*/
@property (nonatomic,copy) NSArray <UIViewController *>*cm_childControllers;


/**标题数组
 默认为cm_childControllers 的 title
 */
@property (nonatomic,copy) NSArray <NSString *>*cm_titles;

/**
 标题正常字体
 默认字体大小:[UIFont systemFontOfSize:15]
 */
@property (nonatomic,strong) UIFont *cm_font;

/**
 标题选中字体
 默认选中字体大小:cm_font的1.15倍
 */
@property (nonatomic,strong) UIFont *cm_selectedFont;

/**
 视图的背景色
 默认颜色:[UIColor whiteColor]
 */
@property (nonatomic,strong) UIColor *cm_backgroundColor;

/**
 标题正常颜色
 默认颜色:[UIColor blackColor]
 */
@property (nonatomic,strong) UIColor *cm_normalColor;

/**
 标题选中颜色
 默认颜色:[UIColor redColor]
 */
@property (nonatomic,strong) UIColor *cm_selectedColor;

/**
 标题高度
 默认高度:44
 */
@property (nonatomic,assign) CGFloat cm_titleHeight;

/**
 titileview在Y方向的位置
 默认:0
 */
@property (nonatomic,assign) CGFloat cm_titleTop;


/**
 是否支持侧滑
 默认值:YES
 */
@property (nonatomic,assign) BOOL cm_slideGestureEnable;

/**
 标题之间的间隔
 */
@property (nonatomic,assign) CGFloat cm_titleMargin;

/**
 最小的标题间距
 默认值为 20
 */
@property (nonatomic,assign) CGFloat cm_minTitleMargin;

/**
 默认选择的index
 默认选择第0个
 */
@property (nonatomic,assign,getter=cm_selectedIndex) NSInteger cm_defaultIndex;

/**
 标题栏下方分割线的颜色
 默认颜色:[UIColor grayColor]
 */
@property (nonatomic,strong) UIColor *cm_seperaterLineColor;

/**
 标题分割线的高度
 默认值:1px
 */
@property (nonatomic,assign) CGFloat cm_seperateLineHeight;

/**
 标题之间的分割线颜色
 默认为:[UIColor lightGrayColor]
 */
@property (nonatomic,strong) UIColor *cm_splitterColor;

/**
 标题之间的分割线size
 默认宽度:1px
 默认高度:标题栏高度的一半
 */
@property (nonatomic,assign) CGSize cm_splitterSize;

/**
 下划线和遮罩,在点击标题时,动画的时间间隔
 默认值为:0.25
 取值范围 0.25~0.8
 (超出范围会使用默认值)
 */
@property (nonatomic,assign) CGFloat cm_animationDruction;


/**右侧视图*/
@property (nonatomic,strong) UIView *cm_rightView;

/**
 父视图控制器
 */
@property (nonatomic,weak,readonly) UIViewController *cm_parentController;

/**
 全屏
 */
@property (nonatomic,assign,getter=cm_isFullScreen) BOOL cm_fullScreen;


#pragma mark --- 缩放效果

/**
 标题的缩放等级 默认为 1.15
 (若觉得该属性不方便,可以使用cm_selectedFont配合cm_font属性进行设置)
 */
@property (nonatomic,assign) CGFloat cm_scale;

/**
 标题宽度
 */
@property (nonatomic,strong,readonly)  NSArray * _Nonnull cm_titleWidths;

/**
 标题的总宽度 + 左右边距 + 所有的标题最小间距
 */
@property (nonatomic,assign,readonly) CGFloat cm_minContentWidth;


/**
 所有标题的总宽度
 */
@property (nonatomic,assign,readonly) CGFloat cm_titlesWidth;

#pragma mark --- 下划线效果

/**
 下划线视图是否圆角
 默认值:NO
 */
@property (nonatomic,assign) BOOL cm_underlineBorder;


/**
 下划线高度
 默认值:2
 */
@property (nonatomic,assign) CGFloat cm_underlineHeight;

/**
 下划线宽度
 默认跟随文字宽度
 设置该属性后下划线会固定使用该宽度
 */
@property (nonatomic,assign) CGFloat cm_underlineWidth;

/**
 下划线跟随文字宽度 * 比例
 比例范围 0 ~ 1.3
 超出 1.3 按 1.0 处理
 */
@property (nonatomic,assign) CGFloat cm_underlineWidthScale;


/**
 下划线颜色
 默认跟随标题的选中颜色
 */
@property (nonatomic,strong) UIColor *cm_underlineColor;



/**
 是否延长
 默认值:NO
 具体效果可以看github效果展示
 */
@property (nonatomic,assign) BOOL cm_underlineStretch;




#pragma mark --- 遮罩效果

/**
 
 遮罩颜色
 */
@property (nonatomic,strong) UIColor *cm_coverColor;

/**
 遮罩圆角半径
 默认为 cover高度的一半
 */
@property (nonatomic,assign) CGFloat cm_coverRadius;


/**
 遮罩固定宽度 未做最大最小限制
 请根据实际情况妥善设置
 */
@property (nonatomic,assign) CGFloat cm_coverWidth;

/**
 遮罩垂直方向边距 未做最大最小限制
 请根据实际情况妥善设置
 */
@property (nonatomic,assign) CGFloat cm_coverVerticalMargin;

/**
 遮罩水平方向边距 未做最大最小限制
 请根据实际情况妥善设置
 */
@property (nonatomic,assign) CGFloat cm_coverHorizontalMargin;




/**
 获得某个颜色的rgba的值
 
 @param color 颜色对象
 @return 返回rgba颜色值数组
 */
CG_EXTERN NSArray* CMColorGetRGBA(UIColor *color);

/**
 获得某个颜色的r值
 
 @param color 颜色对象
 @return 返回r的值
 */
CG_EXTERN CGFloat CMColorGetR(UIColor *color);

/**
 获得某个颜色的g值
 
 @param color 颜色对象
 @return 返回g的值
 */
CG_EXTERN CGFloat CMColorGetG(UIColor *color);

/**
 获得某个颜色的b值
 
 @param color 颜色对象
 @return 返回b的值
 */
CG_EXTERN CGFloat CMColorGetB(UIColor *color);

/**
 获得某个颜色的a值
 
 @param color 颜色对象
 @return 返回a的值
 */
CG_EXTERN CGFloat CMColorGetA(UIColor *color);

/**
 获得指定font的字符串宽度
 
 @param string 目标字符串
 @param font 目标字符串对应的font
 @return 返回该字符串的宽度
 */
CG_EXTERN CGFloat CMStringWidth(NSString *string ,UIFont *font);

//宏定义单利的定义
+ (instancetype)defaultConfig;
+(instancetype) alloc __attribute__((unavailable("please call class method +(instancetype)defaultConfig instead")));
+(instancetype) new __attribute__((unavailable("please call class method +(instancetype)defaultConfig instead")));
-(instancetype) copy __attribute__((unavailable("please call class method +(instancetype)defaultConfig instead")));
-(instancetype) mutableCopy __attribute__((unavailable("please call class method +(instancetype)defaultConfig instead")));

@end

NS_ASSUME_NONNULL_END


================================================
FILE: CMPageTitleView/CMPageTitleView/Class/CMPageTitleConfig.m
================================================
//
//  CMPageTitlem
//  CMPageTitleView
//
//  GitHub 下载地址:https://github.com/CrabMen/CMPageTitleView
//

//  Created by CrabMan on 2019/3/25.
//  Copyright © 2019 CrabMan. All rights reserved.
//


#import "CMPageTitleConfig.h"
#import "CMPageTitleViewMacro.h"
@interface CMPageTitleConfig ()

/**视图宽度*/
@property (nonatomic,strong) NSNumber *cm_pageTitleViewWidth;

@end

@implementation CMPageTitleConfig

#pragma mark -- setter

- (void)setCm_childControllers:(NSArray *)cm_childControllers {
    
    _cm_childControllers = cm_childControllers;
    
    self.cm_titles = [_cm_childControllers valueForKey:@"title"];
    
}

- (void)setCm_titles:(NSArray *)cm_titles {
    
    _cm_titles = cm_titles;
    
    if (_cm_titles.count) {
        NSMutableArray *mArray = [NSMutableArray array];
        for (NSString *string in cm_titles) {
            [mArray addObject:@(CMStringWidth(string, self.cm_font))];
        }
        [self setValue:[mArray copy] forKey:NSStringFromSelector(@selector(cm_titleWidths))];
        
        NSNumber *cm_titlesWidth = [self.cm_titleWidths valueForKeyPath:@"@sum.floatValue"];
        
        [self setValue:cm_titlesWidth forKey:NSStringFromSelector(@selector(cm_titlesWidth))];
    }
    
}

- (void)setCm_selectedFont:(UIFont *)cm_selectedFont {
    
    _cm_selectedFont = cm_selectedFont;
    
    self.cm_scale = self.cm_font.pointSize ? cm_selectedFont.pointSize / self.cm_font.pointSize : self.cm_scale;
    
    
}

- (void)setCm_pageTitleViewWidth:(NSNumber *)cm_pageTitleViewWidth {
    
    _cm_pageTitleViewWidth = cm_pageTitleViewWidth;
    
    if (self.cm_minContentWidth > _cm_pageTitleViewWidth.floatValue) {
        //如果理论最小宽度已经大于视图宽度,对齐样式自动变成居中样式
        if (self.cm_contentMode == CMPageTitleContentMode_Left || self.cm_contentMode == CMPageTitleContentMode_Right) {
            self.cm_contentMode = CMPageTitleContentMode_Center;
            
        }
    }
    
}

- (void)setCm_underlineWidthScale:(CGFloat)cm_underlineWidthScale {
    _cm_underlineWidthScale = cm_underlineWidthScale;
    
    _cm_underlineWidthScale = fabs(_cm_underlineWidthScale) > 1.3 || _cm_underlineWidthScale == 0 ? 1 :fabs(_cm_underlineWidthScale) ;
    
}

- (void)setCm_defaultIndex:(NSInteger)cm_defaultIndex {
    _cm_defaultIndex = cm_defaultIndex;
    
    _cm_defaultIndex = _cm_defaultIndex < self.cm_titles.count ? _cm_defaultIndex : 0;
    
    
}

- (void)setCm_animationDruction:(CGFloat)cm_animationDruction {
    
    _cm_animationDruction = (cm_animationDruction >= 0.25 && cm_animationDruction <= 0.8 ) ? cm_animationDruction : 0.25 ;

}

- (void)setCm_contentMode:(CMPageTitleContentMode)cm_contentMode {
    _cm_contentMode = cm_contentMode;
    NSUInteger count = self.cm_contentMode == CMPageTitleContentMode_Center ? self.cm_titles.count + 1 : self.cm_titles.count;
    [self setValue:@(self.cm_titlesWidth + count * self.cm_minTitleMargin) forKey:NSStringFromSelector(@selector(cm_minContentWidth))];
    
    _cm_contentMode = cm_contentMode;
    
    if (cm_contentMode == CMPageTitleContentMode_Left) {
        //左对齐
        
        _cm_titleMargin = _cm_titleMargin ?: self.cm_minTitleMargin;
        
    } else if (cm_contentMode == CMPageTitleContentMode_Right) {
        //右对齐
        
        _cm_titleMargin = _cm_titleMargin ?: self.cm_minTitleMargin;
        
    }else if (cm_contentMode == CMPageTitleContentMode_Center ) {
        
        if (self.cm_titlesWidth  >= self.cm_pageTitleViewWidth.floatValue) {
            _cm_titleMargin = _cm_titleMargin ?: self.cm_minTitleMargin;
            
        } else {
            
            NSUInteger count =  self.cm_titles.count + 1 ;
            
            CGFloat titleMargin = (self.cm_pageTitleViewWidth.floatValue - self.cm_titlesWidth )/count;
            
            _cm_titleMargin = titleMargin < self.cm_minTitleMargin ? self.cm_minTitleMargin : titleMargin;
            
        }
    } else if (cm_contentMode == CMPageTitleContentMode_SpaceAround) {
        
        
        if (self.cm_titlesWidth  >= self.cm_pageTitleViewWidth.floatValue) {
            _cm_titleMargin = _cm_titleMargin ?: self.cm_minTitleMargin;
            
        }else {
            
            NSUInteger count =  self.cm_titles.count;
            
            CGFloat titleMargin = (self.cm_pageTitleViewWidth.floatValue - self.cm_titlesWidth )/count;
            
            _cm_titleMargin = titleMargin;
            
        }
        
    }
    
}

- (void)setCm_rightView:(UIView *)cm_rightView {
    _cm_rightView = cm_rightView;
    
    if (_cm_rightView.cm_height > self.cm_titleHeight) {
        _cm_rightView.cm_height = self.cm_titleHeight;
    }
    
}



+ (instancetype)defaultConfig{
    
    
    return [[super alloc]initWithDefaultConfig];
}


- (instancetype)initWithDefaultConfig {
    
    
    if (self = [super init]) {
        
        self.cm_titleHeight = 44;
        
        self.cm_font = [UIFont systemFontOfSize:15];
        
        self.cm_backgroundColor = [UIColor whiteColor];
        
        self.cm_normalColor = [UIColor blackColor];
        
        self.cm_selectedColor = [UIColor redColor];
        
        _cm_defaultIndex = 0;
        
        self.cm_minTitleMargin = 20;
        
        self.cm_scale = 1.2;
        
        self.cm_animationDruction = 0.25;
        
        self.cm_contentMode = CMPageTitleContentMode_Center;
        
        self.cm_slideGestureEnable = YES;
        
        self.cm_underlineStretch = NO;
        
        self.cm_seperateLineHeight = 1.0 / [UIScreen mainScreen].scale;
        
        self.cm_seperaterLineColor = [UIColor lightGrayColor];
        
        self.cm_underlineColor = self.cm_selectedColor;
        
        self.cm_underlineWidthScale = 1;
        
        self.cm_underlineHeight = 2;
        
        self.cm_coverVerticalMargin = 5;
        
        self.cm_coverHorizontalMargin = 10;
        
        self.cm_splitterColor = [UIColor lightGrayColor];
        
        self.cm_splitterSize = CGSizeMake(1.0 / [UIScreen mainScreen].scale, 22);
        
        
    }
    return self;
    
}




CG_EXTERN NSArray* CMColorGetRGBA(UIColor *color) {
    
    CGFloat red = 0.0;
    CGFloat green = 0.0;
    CGFloat blue = 0.0;
    CGFloat alpha = 0.0;
    [color getRed:&red green:&green blue:&blue alpha:&alpha];
    return @[@(red), @(green), @(blue), @(alpha)];
    
}

CG_EXTERN CGFloat CMColorGetR(UIColor *color) {
    
    return  [CMColorGetRGBA(color)[0] floatValue];
    
}

CG_EXTERN CGFloat CMColorGetG(UIColor *color) {
    
    return  [CMColorGetRGBA(color)[1] floatValue];
}

CG_EXTERN CGFloat CMColorGetB(UIColor *color) {
    
    return  [CMColorGetRGBA(color)[2] floatValue];
}

CG_EXTERN CGFloat CMColorGetA(UIColor *color) {
    
    return  [CMColorGetRGBA(color)[3] floatValue];
    
}

CG_EXTERN CGFloat CMStringWidth(NSString *string ,UIFont *font) {
    
    if ([string isKindOfClass:[NSNull class]] || string == nil || string.length == 0) {
        NSException *exception = [NSException exceptionWithName:@"CMStringWidth C Method Exception" reason:@"title的标题不能为空" userInfo:nil];
        [exception raise];
    }
    
    CGFloat width = [string boundingRectWithSize:CGSizeMake(MAXFLOAT, 0) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading |  NSStringDrawingTruncatesLastVisibleLine attributes:@{NSFontAttributeName:font} context:nil].size.width ;
    
    return ceilf(width);
}



@end


================================================
FILE: CMPageTitleView/CMPageTitleView/Class/CMPageTitleContentView.h
================================================
//
//  CMPageTitleContentView.h
//  CMDisplayTitleView
//
//  GitHub 下载地址:https://github.com/CrabMen/CMPageTitleView
//

//  Created by CrabMan on 2018/1/15.
//  Copyright © 2018年 CrabMan. All rights reserved.
//

#import <UIKit/UIKit.h>
#import "CMPageTitleConfig.h"
@protocol CMPageTitleContentViewDelegate <NSObject>

@required
/**
 当CMPageTitleContentView 中标题被点击会调用该代理方法

 @param index 当前点击的标题的index
 @param repeat 是否是重复点击
 */
- (void)cm_pageTitleContentViewClickWithLastIndex:(NSUInteger)LastIndex Index:(NSUInteger)index Repeat:(BOOL)repeat;

@end


@interface CMPageTitleContentView : UIScrollView

/**选中的标题*/
@property (nonatomic,assign) NSInteger cm_selectedIndex;


/**点击daili*/
@property (nonatomic,weak) id <CMPageTitleContentViewDelegate> cm_delegate;


/**
 初始化方法

 @param config 配置对象
 @return CMPageTitleContentView对象
 */
- (instancetype)initWithConfig:(CMPageTitleConfig *)config;


/**
 
 根据CMPageContentView对象的滚动情况,
 调整CMPageTitleContentView对象的滚动情况
 
 @param progress 0~1 推拽比例
 @param leftIndex 左边的下标
 @param rightIndex 右边的下标
 */
- (void)cm_pageTitleViewDidScrollProgress:(CGFloat)progress LeftIndex:(NSUInteger)leftIndex RightIndex:(NSUInteger)rightIndex;


/**
 根据CMPageContentView对象的滚动情况,
 调整CMPageTitleContentView对象的滚动情况
 @param scrollView  CMPageContentView对象
 */
- (void)cm_pageTitleContentViewAdjustPosition:(UIScrollView *)scrollView;


- (void)cm_remodifyTitlePosition;

@end




@interface CMDisplayTitleLabel : UILabel

@property (nonatomic,assign) CGFloat cm_progress;
@property (nonatomic,strong) UIColor *cm_fillColor;

@end


================================================
FILE: CMPageTitleView/CMPageTitleView/Class/CMPageTitleContentView.m
================================================
//
//  CMPageTitleContentView.m
//  CMDisplayTitleView
//
//  GitHub 下载地址:https://github.com/CrabMen/CMPageTitleView
//

//  Created by CrabMan on 2018/1/15.
//  Copyright © 2018年 CrabMan. All rights reserved.
//

#import "CMPageTitleContentView.h"
@interface CMPageTitleContentView ()


/**配置*/
@property (nonatomic,strong) CMPageTitleConfig *config;

/**选中的标题*/
@property (nonatomic,strong) CMDisplayTitleLabel *selectedLabel;

/**是否点击了标题*/
@property (nonatomic,assign) BOOL isClickTitle;

/**下划线*/
@property (nonatomic,weak) UIView *underLine;

/**遮罩*/
@property (nonatomic,weak) UIView *titleCover;

/**label数组*/
@property (nonatomic,strong) NSMutableArray *titleLabels;

/**上一次的偏移量*/
@property (nonatomic,assign) CGFloat lastOffsetX;


/**分割线视图数组*/
@property (nonatomic,strong) NSArray *splitters;



@end


@implementation CMPageTitleContentView


- (NSArray *)splitters {
    
    if (!_splitters) {
        NSMutableArray *mArray = [NSMutableArray array];
        
        for (NSInteger i = 0 ; i < self.titleLabels.count - 1; i++) {
            UIView *splitter = [UIView new];
            splitter.backgroundColor = self.config.cm_splitterColor;
            splitter.cm_size = CGSizeMake(self.config.cm_splitterSize.width, self.config.cm_splitterSize.height);
            splitter.center = CGPointMake(CGRectGetMaxX([self.titleLabels[i] frame]) + self.config.cm_titleMargin * 0.5, self.config.cm_titleHeight * 0.5);
            [self addSubview:splitter];
            [mArray addObject:splitter];
        }
        _splitters = [mArray copy];
    }
    
    return _splitters;
}

- (NSMutableArray *)titleLabels {
    
    if (!_titleLabels) {
        _titleLabels = [NSMutableArray array];
        
        CGFloat labelX = 0;
        CGFloat labelW = 0;
        
        for (int i = 0; i < self.config.cm_titles.count; i++) {
            CMDisplayTitleLabel *label = [CMDisplayTitleLabel new];
            label.textColor = self.config.cm_normalColor;
            label.font = self.config.cm_font;
            label.text = self.config.cm_titles[i];
            label.lineBreakMode = NSLineBreakByWordWrapping;
            label.translatesAutoresizingMaskIntoConstraints = NO;
            
            UILabel *lastLabel = [self.titleLabels lastObject];
            if (i == 0 ) {
                if (self.config.cm_contentMode == CMPageTitleContentMode_Right) {
                    labelX = [[self.config valueForKey:@"cm_pageTitleViewWidth"] floatValue] - self.config.cm_titleMargin * self.config.cm_titles.count - self.config.cm_titlesWidth;
                } else if (self.config.cm_contentMode == CMPageTitleContentMode_SpaceAround) {
                    labelX = self.config.cm_titleMargin * 0.5;
                } else {
                    labelX =  self.config.cm_titleMargin;
                }
            } else {
                labelX =  self.config.cm_titleMargin + CGRectGetMaxX(lastLabel.frame);
            }
            labelW = [self.config.cm_titleWidths[i] floatValue];
            
            [self addSubview:label];
            
            NSLayoutConstraint *leftConstraint = [NSLayoutConstraint constraintWithItem:label attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.titleLabels.lastObject ?: self attribute:self.titleLabels.lastObject ? NSLayoutAttributeRight : NSLayoutAttributeLeft multiplier:1 constant:labelX];
            NSLayoutConstraint *centerYConstraint = [NSLayoutConstraint constraintWithItem:label attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem: self attribute: NSLayoutAttributeCenterY multiplier:1 constant:0];
            
            [NSLayoutConstraint activateConstraints:@[leftConstraint,centerYConstraint]];
            
            label.userInteractionEnabled = YES;
            UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(clickLabel:)];
            [label addGestureRecognizer:tap];
            
            [_titleLabels addObject:label];
        }
        
        
    }
    return _titleLabels;
}

- (UIView *)underLine {
    
    if (!_underLine) {
        UIView *underLine = [UIView new];
        underLine.backgroundColor = self.config.cm_underlineColor;
        underLine.layer.cornerRadius = self.config.cm_underlineBorder ? self.config.cm_underlineHeight * 0.5 : 0;
        underLine.layer.masksToBounds = YES;
        CGFloat underLineWidth = self.config.cm_underlineWidth ?: [self.titleLabels[self.config.cm_selectedIndex] cm_width] * self.config.cm_underlineWidthScale;
        underLine.cm_height = self.config.cm_underlineHeight;
        underLine.cm_bottom = self.config.cm_titleHeight;
        underLine.cm_width  = underLineWidth;
        underLine.cm_centerX = [self.titleLabels[self.config.cm_selectedIndex] cm_centerX];
        _underLine = underLine;
        [self addSubview:_underLine];

    }
    
    return _underLine ;
    
}


-(UIView *)titleCover {
    
    if (!_titleCover) {
        
        UIView *titleCover = [UIView new];
        titleCover.backgroundColor = self.config.cm_coverColor ?: [UIColor colorWithWhite:0 alpha:0.3];
        UILabel *label = self.titleLabels[self.config.cm_selectedIndex];
        CGFloat width = [self.config.cm_titleWidths[self.config.cm_selectedIndex] floatValue];
        CGFloat coverW = self.config.cm_coverWidth ? : width + 2 * self.config.cm_coverHorizontalMargin;
        CGFloat coverH = label.font.pointSize + 2 * self.config.cm_coverVerticalMargin;
        titleCover.layer.cornerRadius = self.config.cm_coverRadius ?: coverH * 0.5;
        titleCover.cm_height = coverH;
        titleCover.cm_width = coverW;
        titleCover.cm_centerX = label.cm_centerX;
        titleCover.cm_centerY = self.config.cm_titleHeight * 0.5;
        _titleCover = titleCover;
        [self insertSubview:_titleCover atIndex:0];

    }
    return _titleCover ;
}

- (void)setCm_selectedIndex:(NSInteger)cm_selectedIndex {
    
    _cm_selectedIndex = cm_selectedIndex;
    
    [self selectLabel:self.titleLabels[cm_selectedIndex]];
    
}



#pragma mark --- Initial

- (instancetype)initWithConfig:(CMPageTitleConfig *)config {
    
    if (self = [super init]) {
        self.config = config;
        
        self.backgroundColor = self.config.cm_backgroundColor ? : [UIColor whiteColor];
        self.showsVerticalScrollIndicator = NO;
        self.showsHorizontalScrollIndicator = NO;
        [self initSubViews];
        if (self.cm_navigationController && self.config.cm_slideGestureEnable) {
            [self.panGestureRecognizer requireGestureRecognizerToFail:self.cm_navigationController.interactivePopGestureRecognizer];
        }
    }
    
    return self;
}


- (void)layoutSubviews {
    [super layoutSubviews];
    [self modifyContentInset];
    if (!self.selectedLabel && self.cm_delegate) {
        [self clickLabel:nil];
    }
    
}

- (void)initSubViews {
    
    [self initContentSize];
    [self initSplitters];
    [self modifyContentInset];
}

- (void)modifyContentInset {
    
    self.contentInset = UIEdgeInsetsMake(0, 0, 0, (self.config.cm_rightView && self.config.cm_contentMode != CMPageTitleContentMode_Right)? (self.config.cm_titleMargin+self.config.cm_rightView.cm_width) : self.config.cm_titleMargin);
    
}


- (void)initContentSize{
    
    
    [self titleLabels];
    
    [self layoutIfNeeded];
    
    switch (self.config.cm_contentMode) {
        case CMPageTitleContentMode_SpaceAround:
            self.contentSize = CGSizeMake(CGRectGetMaxX([self.titleLabels.lastObject frame]) - self.config.cm_titleMargin * 0.5, 0);
            
            break;
        case CMPageTitleContentMode_Left:
            self.contentSize = self.bounds.size;
            
            break;
        case CMPageTitleContentMode_Right:
            self.contentSize = self.bounds.size;
            
            break;
        case CMPageTitleContentMode_Center:
            self.contentSize = CGSizeMake(CGRectGetMaxX([self.titleLabels.lastObject frame]), 0);
            break;
            
        default:
            break;
    }
    
}

- (void)initSplitters {
    
    if (self.config.cm_additionalMode & CMPageTitleAdditionalMode_Splitter) {
        [self splitters];
        
    }
    
    
}

- (void)resetLayoutConstraintWithLabel:(UILabel *)label Scale:(CGFloat)scale{
    
    if (![self.titleLabels containsObject:label] ||
        self.config.cm_scaleGradientContentMode == CMPageTitleScaleGradientContentMode_Center ||
        !(self.config.cm_switchMode & CMPageTitleSwitchMode_Scale)) return;
    
    NSInteger index = [self.titleLabels indexOfObject:label];
    
    NSInteger selectedIndex = self.selectedLabel ? [self.titleLabels indexOfObject:self.selectedLabel] : -1;
    
    NSLayoutConstraint *centerYConstraint = self.constraints[index*2 + 1];
    NSLayoutConstraint *selectedCenterYConstraint = self.selectedLabel ?  self.constraints[selectedIndex*2 + 1] : nil;
    
    switch (self.config.cm_scaleGradientContentMode) {
            
        case CMPageTitleScaleGradientContentMode_Bottom:
            
            centerYConstraint.constant = 0 - label.font.pointSize * 0.5 * (scale - 1);
            selectedCenterYConstraint.constant = 0;
            break;
            
        case CMPageTitleScaleGradientContentMode_Top:
            
            centerYConstraint.constant = label.font.pointSize * 0.5 * (scale - 1);
            selectedCenterYConstraint.constant = 0;
            break;
            
        default:
            break;
    }
    
}

- (void)cm_pageTitleContentViewAdjustPosition:(UIScrollView *)scrollView {
    
    NSInteger centerIndex = floorf(scrollView.contentOffset.x / self.cm_width);
    
    [self setLabelTitleCenter:self.titleLabels[centerIndex] animated:YES];
    
}


#pragma mark --- 样式视图

- (void)setUnderLineWithLabel:(UILabel *)label {
    
    if (!(self.config.cm_switchMode & CMPageTitleSwitchMode_Underline)) return;
    
    [self underLine];
    
    CGFloat underLineWidth = self.config.cm_underlineWidth ?: label.cm_width * self.config.cm_underlineWidthScale;
    [UIView animateWithDuration:self.config.cm_animationDruction animations:^{
        self.underLine.cm_width = underLineWidth;
        self.underLine.cm_centerX = label.cm_centerX;
        
    }];
    
    
}

/**遮罩样式*/
- (void)setTitleCoverWithLabel:(UILabel *)label {
    
    if (!(self.config.cm_switchMode & CMPageTitleSwitchMode_Cover)) return;
    
    [self titleCover];
    
    NSUInteger index = [self.titleLabels indexOfObject:label];
    CGFloat width = [self.config.cm_titleWidths[index] floatValue];
    CGFloat coverW = self.config.cm_coverWidth ? : width + 2 * self.config.cm_coverHorizontalMargin;
    [UIView animateWithDuration:self.config.cm_animationDruction animations:^{
        self.titleCover.cm_width = coverW;
        self.titleCover.cm_centerX = label.cm_centerX;
    }];
        
    
}


/**label点击事件*/
- (void)clickLabel:(UIGestureRecognizer *)tap {
    
    // 记录是否点击标题,通过这个属性防止标题二次偏移
    _isClickTitle = YES;
    
    // 获取对应标题label
    CMDisplayTitleLabel *label = tap ? (CMDisplayTitleLabel *)tap.view : self.titleLabels[self.config.cm_selectedIndex];
    
    if (self.cm_delegate) {
        [self.cm_delegate cm_pageTitleContentViewClickWithLastIndex:self.cm_selectedIndex Index:[self.titleLabels indexOfObject:label] Repeat:label == self.selectedLabel];
    }
    
    _cm_selectedIndex = [self.titleLabels indexOfObject:label];
    
    [self selectLabel:label];
    
    _isClickTitle = NO;
    
}

- (void)cm_remodifyTitlePosition{

    [self setLabelTitleCenter:self.selectedLabel animated:NO];
    [self setUnderLineWithLabel:self.selectedLabel];

}
- (void)modifyTitlePosition:(CMDisplayTitleLabel *)label {
    
    [self setLabelTitleCenter:label animated:YES];
    [self setTitleScaleCenter:label];
    [self setTitleCoverWithLabel:label];
    [self setUnderLineWithLabel:label];
    
}

/**
 选中标题Label的设置
 */
- (void)selectLabel:(CMDisplayTitleLabel *)label {
    
    
    if (_selectedLabel == label) return;
    
    [self modifyTitlePosition:label];
    
    _selectedLabel.textColor = self.config.cm_normalColor;
    _selectedLabel.cm_progress = 0;

    label.textColor = self.config.cm_selectedColor;
    label.cm_fillColor = self.config.cm_selectedColor;
    label.cm_progress = 0;
//
    _selectedLabel = (CMDisplayTitleLabel *)label;
    _lastOffsetX = [self.titleLabels indexOfObject:label] * self.cm_width;
    
}


- (void)setTitleScaleCenter:(UILabel *)label {
    
    if (!(self.config.cm_switchMode & CMPageTitleSwitchMode_Scale)) return;
    
    self.selectedLabel.cm_progress = 1;
    self.selectedLabel.cm_fillColor = self.config.cm_selectedColor;
    label.transform = CGAffineTransformMakeScale(self.config.cm_scale, self.config.cm_scale);
    self.selectedLabel.transform = CGAffineTransformIdentity;
    
    [self resetLayoutConstraintWithLabel:label Scale:self.config.cm_scale];
    
}

/**
 让选中的按钮居中显示
 */
- (void)setLabelTitleCenter:(UILabel *)label animated:(BOOL)animated {
    
    
    if (self.contentSize.width <= self.cm_width) return;
    
    
    CGFloat offsetX = label.center.x - self.cm_width * 0.5;
    
    offsetX = offsetX > 0 ? offsetX : 0;
    
    CGFloat maxOffsetX = self.contentSize.width - self.cm_width + self.contentInset.right;
    
    maxOffsetX = maxOffsetX ?:0;
    
    offsetX = offsetX > maxOffsetX ? maxOffsetX : offsetX;
    
    [self setContentOffset:CGPointMake(offsetX, 0) animated:animated];
    
    
}




- (void)cm_pageTitleViewDidScrollProgress:(CGFloat)progress LeftIndex:(NSUInteger)leftIndex RightIndex:(NSUInteger)rightIndex {
    
    [self modifyTitleScaleWithScrollProgress:progress LeftIndex:leftIndex RightIndex:rightIndex];
    
    [self modifyColorWithScrollProgress:progress LeftIndex:leftIndex RightIndex:rightIndex];
    
    [self modifyUnderlineWithScrollProgress:progress LeftIndex:leftIndex RightIndex:rightIndex];
    
    [self modifyCoverWithScrollProgress:progress LeftIndex:leftIndex RightIndex:rightIndex];
    
    self.lastOffsetX = leftIndex * self.cm_width + progress * self.cm_width;
}



#pragma mark --- 标题各效果渐变

- (void)modifyColorWithScrollProgress:(CGFloat)progress LeftIndex:(NSUInteger)leftIndex RightIndex:(NSUInteger)rightIndex {
    
    if (_isClickTitle || rightIndex >= self.titleLabels.count) return;
    
    CMDisplayTitleLabel *rightLabel = self.titleLabels[rightIndex];
    CMDisplayTitleLabel *leftLabel = self.titleLabels[leftIndex];
    
    CGFloat rightScale = progress;
    
    CGFloat leftScale = 1 - rightScale;
    
    if (self.config.cm_gradientStyle == CMTitleColorGradientStyle_RGB) {
        
        NSArray *endRGBA = CMColorGetRGBA(self.config.cm_selectedColor);
        NSArray *startRGBA = CMColorGetRGBA(self.config.cm_normalColor);
        
        CGFloat deltaR = [endRGBA[0] floatValue] - [startRGBA[0] floatValue];
        CGFloat deltaG = [endRGBA[1] floatValue] - [startRGBA[1] floatValue];
        CGFloat deltaB = [endRGBA[2] floatValue] - [startRGBA[2] floatValue];
        CGFloat deltaA = [endRGBA[3] floatValue] - [startRGBA[3] floatValue];
        
        
        UIColor *rightColor = [UIColor colorWithRed:[startRGBA[0] floatValue] + rightScale *deltaR green:[startRGBA[1] floatValue] + rightScale *deltaG blue:[startRGBA[2] floatValue] + rightScale *deltaB alpha:[startRGBA[3] floatValue] + rightScale *deltaA];
        
        UIColor *leftColor = [UIColor colorWithRed:[startRGBA[0] floatValue] + leftScale * deltaR green:[startRGBA[1] floatValue] + leftScale *deltaG blue:[startRGBA[2] floatValue] + leftScale *deltaB alpha:[startRGBA[3] floatValue] + leftScale *deltaA];
        
        rightLabel.textColor = rightColor;
        leftLabel.textColor = leftColor;
        
    }
    
    // 填充渐变
    if (self.config.cm_gradientStyle == CMTitleColorGradientStyle_Fill) {
        
        rightLabel.textColor    = self.config.cm_normalColor;
        rightLabel.cm_fillColor = self.config.cm_selectedColor;
        rightLabel.cm_progress  = rightScale;
        
        leftLabel.textColor     = self.config.cm_selectedColor;
        leftLabel.cm_fillColor  = self.config.cm_normalColor;
        leftLabel.cm_progress   = rightScale;
        
    }
    
}


- (void)modifyTitleScaleWithScrollProgress:(CGFloat)progress LeftIndex:(NSUInteger)leftIndex RightIndex:(NSUInteger)rightIndex {
    
    
    if (!(self.config.cm_switchMode & CMPageTitleSwitchMode_Scale) || _isClickTitle || rightIndex >= self.titleLabels.count || self.config.cm_switchMode & CMPageTitleSwitchMode_Delay) return;
    
    CMDisplayTitleLabel *rightLabel = self.titleLabels[rightIndex];
    CMDisplayTitleLabel *leftLabel = self.titleLabels[leftIndex];
    
    CGFloat rightScale = progress;
    
    CGFloat leftScale = 1 - rightScale;
    
    CGFloat scaleTransform = self.config.cm_scale;
    
    scaleTransform -= 1;
    leftLabel.transform = CGAffineTransformMakeScale(leftScale * scaleTransform + 1, leftScale * scaleTransform + 1);
    rightLabel.transform = CGAffineTransformMakeScale(rightScale * scaleTransform + 1, rightScale * scaleTransform +1);
    
    if (self.selectedLabel == leftLabel) {
        
        [self resetLayoutConstraintWithLabel:rightLabel Scale:round(rightScale * scaleTransform * 100)/100.0 + 1];
    }
    
    if (self.selectedLabel == rightLabel) {
        
        [self resetLayoutConstraintWithLabel:leftLabel Scale:round(leftScale * scaleTransform * 100)/100.0 + 1];
    }
    
    
    
}




- (void)modifyCoverWithScrollProgress:(CGFloat)progress LeftIndex:(NSUInteger)leftIndex RightIndex:(NSUInteger)rightIndex {
    
    
    //通过判断isClickTitle的属性来防止二次偏移
    if (!(self.config.cm_switchMode & CMPageTitleSwitchMode_Cover) || _isClickTitle || rightIndex >= self.titleLabels.count|| self.config.cm_switchMode & CMPageTitleSwitchMode_Delay) return;
    
    CMDisplayTitleLabel *rightLabel = self.titleLabels[rightIndex];
    CMDisplayTitleLabel *leftLabel = self.titleLabels[leftIndex];
    
    
    CGFloat deltaX = self.config.cm_coverWidth ? rightLabel.cm_centerX - leftLabel.cm_centerX : rightLabel.cm_x - leftLabel.cm_x;
    
    CGFloat deltaWidth = self.config.cm_coverWidth ? 0 : rightLabel.cm_width - leftLabel.cm_width;
    
    
    CGFloat newCenterX = progress * deltaX + leftLabel.cm_centerX ;
    CGFloat newWidth = self.config.cm_coverWidth ? : (progress * deltaWidth + leftLabel.cm_width + 2*self.config.cm_coverHorizontalMargin);
    self.titleCover.cm_centerX = newCenterX;
    self.titleCover.cm_width = newWidth;
    
    
}



- (void)modifyUnderlineWithScrollProgress:(CGFloat)progress LeftIndex:(NSUInteger)leftIndex RightIndex:(NSUInteger)rightIndex {
    
    
    if (!(self.config.cm_switchMode & CMPageTitleSwitchMode_Underline) || _isClickTitle || rightIndex >= self.titleLabels.count|| self.config.cm_switchMode & CMPageTitleSwitchMode_Delay) return;
    
    CMDisplayTitleLabel *rightLabel = self.titleLabels[rightIndex];
    CMDisplayTitleLabel *leftLabel = self.titleLabels[leftIndex];
    
    
    CGFloat rightLabelX = rightLabel.cm_x + (1 - self.config.cm_underlineWidthScale)*rightLabel.cm_width*0.5;
    CGFloat leftLabelX = leftLabel.cm_x + (1 - self.config.cm_underlineWidthScale)*leftLabel.cm_width*0.5;
    CGFloat rightLabelWidth = rightLabel.cm_width * self.config.cm_underlineWidthScale;
    CGFloat leftLabelWidth = leftLabel.cm_width * self.config.cm_underlineWidthScale;
    
    if (!self.config.cm_underlineStretch) {
        
        CGFloat deltaX = self.config.cm_underlineWidth ? (rightLabel.cm_centerX - leftLabel.cm_centerX) : (rightLabelX - leftLabelX);
        
        CGFloat deltaWidth = self.config.cm_underlineWidth ? 0 : (rightLabelWidth - leftLabelWidth);
        
        CGFloat newOriginalX = self.config.cm_underlineWidth ? progress*deltaX + leftLabel.cm_centerX - self .config.cm_underlineWidth * 0.5: progress * deltaX + leftLabelX;
        CGFloat newWidth = self.config.cm_underlineWidth ? : (progress * deltaWidth + leftLabelWidth);
        
        self.underLine.cm_x = newOriginalX;
        self.underLine.cm_width = newWidth;
        
    } else {
        
        CGFloat rightLabelRight = rightLabel.cm_right - (rightLabel.cm_width - rightLabelWidth)*0.5;
        CGFloat leftLabelRight = leftLabel.cm_right - (leftLabel.cm_width - leftLabelWidth)*0.5;
        
        if (progress <= 0.5) {
            CGFloat deltaWidth =  self.config.cm_underlineWidth ? (rightLabel.cm_centerX - leftLabel.cm_centerX) : rightLabelRight - leftLabelRight;
            
            CGFloat originalWidth = self.config.cm_underlineWidth ?: leftLabelWidth;
            
            CGFloat newWidth = 2 * progress * deltaWidth + originalWidth;
            
            CGFloat originalX = self.config.cm_underlineWidth ? leftLabel.cm_centerX - self.config.cm_underlineWidth * 0.5 : leftLabelX;
            
            self.underLine.cm_width = newWidth;
            self.underLine.cm_x = originalX;
            
            
        } else {
            
            CGFloat deltaWidth = self.config.cm_underlineWidth ? (rightLabel.cm_centerX - leftLabel.cm_centerX) : rightLabelX - leftLabelX;
            progress = 1- progress;
            CGFloat newWidth = 2 * progress * deltaWidth + (self.config.cm_underlineWidth ?: rightLabelWidth);
            CGFloat originalX = self.config.cm_underlineWidth ? rightLabel.cm_centerX + self.config.cm_underlineWidth * 0.5 - newWidth : rightLabelRight - newWidth;
            
            self.underLine.cm_x = originalX;
            self.underLine.cm_width = newWidth;
            
        }
    }
    
}



@end



@implementation CMDisplayTitleLabel

-(void)drawRect:(CGRect)rect {
    [super drawRect: rect];
    
    [_cm_fillColor set];
    
    rect.size.width = rect.size.width *_cm_progress;
    
    UIRectFillUsingBlendMode(rect, kCGBlendModeSourceIn);
    
}

-(instancetype)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame] ) {
        self.userInteractionEnabled = YES;
        
        self.textAlignment = NSTextAlignmentCenter;
    }
    return self;
}

- (void)setCm_progress:(CGFloat)cm_progress {
    _cm_progress  = cm_progress;
    
    [self setNeedsDisplay];
    
}

@end


================================================
FILE: CMPageTitleView/CMPageTitleView/Class/CMPageTitleView.h
================================================
//
//  CMPageTitleView.h
//  CMDisplayTitleView
//
//  GitHub 下载地址:https://github.com/CrabMen/CMPageTitleView
//

//  Created by CrabMan on 2018/1/15.
//  Copyright © 2018年 Mac. All rights reserved.
//

#import <UIKit/UIKit.h>
#import "CMPageTitleConfig.h"

@protocol CMPageTitleViewDelegate <NSObject>

@optional
/**
 当标题被点击会或滚动选中后调用该代理方法
 
 @param index 当前选中的标题的index
 @param repeat 是否是重复点击
 */
- (void)cm_pageTitleViewSelectedWithIndex:(NSInteger)index Repeat:(BOOL)repeat;


/**
 当标题被点击会调用该方法
 
 @param index 当前选中的标题的index
 @param repeat 是否是重复点击
 */
- (void)cm_pageTitleViewClickWithIndex:(NSInteger)index Repeat:(BOOL)repeat;

/**
 当标题滚动选中后调用该代理方法
 
 @param index 当前选中的标题的index

 */
- (void)cm_pageTitleViewScrollToIndex:(NSInteger)index;

@end

@interface CMPageTitleView : UIView

/**
 代理
 */
@property (nonatomic,assign) id <CMPageTitleViewDelegate> delegate;

/**
 配置
 */
@property (nonatomic,strong) CMPageTitleConfig *cm_config;




/**重载配置*/
- (void)cm_reloadConfig;

@end


================================================
FILE: CMPageTitleView/CMPageTitleView/Class/CMPageTitleView.m
================================================
//
//  CMPageTitleView.m
//  CMDisplayTitleView
//
//  GitHub 下载地址:https://github.com/CrabMen/CMPageTitleView
//

//  Created by CrabMan on 2018/1/15.
//  Copyright © 2018年 Mac. All rights reserved.
//


#import "CMPageTitleView.h"
#import "CMPageTitleContentView.h"
#import "CMPageContentView.h"
#import "CMPageTitleViewMacro.h"
#import <objc/runtime.h>

@interface CMPageTitleView() <CMPageTitleContentViewDelegate,CMPageContentViewDelegate>

@property (nonatomic,weak) CMPageTitleContentView *titleView;

@property (nonatomic,weak) CMPageContentView *contentView;

@property (nonatomic,weak) UIView *seperateline;

@property (nonatomic,strong) UIViewController *parentController;

@end

@implementation CMPageTitleView

- (UIView *)seperateline {
    
    if (!_seperateline) {
        
        UIView *seperateline = [[UIView alloc] init];
        seperateline.backgroundColor = self.cm_config.cm_seperaterLineColor;
        _seperateline = seperateline;
        [self addSubview:_seperateline];
    }
    
    return _seperateline;
}

- (CMPageTitleContentView *)titleView {
    
    if (!_titleView) {
        CMPageTitleContentView *titleView = [[CMPageTitleContentView alloc] initWithConfig:self.cm_config];
        titleView.cm_delegate = self;
        _titleView = titleView;
        
        [self addSubview:_titleView];
    }
    return _titleView;
}


- (CMPageContentView *)contentView {
    if (!_contentView) {
        
        CMFlowLayout *layout = [CMFlowLayout new];
        layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;
        CMPageContentView *contentView = [[CMPageContentView alloc] initWithFrame:CGRectZero collectionViewLayout:layout Config:self.cm_config];
        contentView.cm_delegate = self;
        _contentView = contentView;
        [self addSubview:_contentView];
        
    }
    return _contentView;
}

- (UIViewController *)parentController {
    
    for (UIView* next = [self superview]; next; next = next.superview) {
        UIResponder *nextResponder = [next nextResponder];
        if ([nextResponder isKindOfClass:[UIViewController class]]) {
            return (UIViewController *)nextResponder;
        }
    }
    return nil;
}


- (void)layoutSubviews {
    
    [super layoutSubviews];
    [self initSubViews];
    [self orientation];

}

- (void)orientation {
    [self.contentView cm_setContentOffset:CGPointMake(self.titleView.cm_selectedIndex * self.contentView.cm_width, 0) ];
    [self.titleView cm_remodifyTitlePosition];
}

- (void)cm_reloadConfig {
    
    [self.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
    
    self.seperateline = nil;
    self.titleView = nil;
    self.contentView = nil;
    
    [self layoutSubviews];
    
    
}


- (void)initSubViews {
    
    CMPageErrorAssert(self.cm_config != nil, @"cm_config属性不能为空");
    self.userInteractionEnabled = YES;
    [self reviseConfig];
    [self initVFLContraints];
    
}

- (void)reviseConfig{
    
    CMPageErrorAssert((self.cm_config.cm_childControllers != nil || self.cm_config.cm_childControllers.count == 0 ), @"cm_childControllers数组需赋值,且数组个数不为空");
    CMPageErrorAssert((self.cm_config.cm_titles != nil || self.cm_config.cm_titles.count == 0 ), @"cm_titles数组需赋值,且数组个数不为空");
    [self.cm_config setValue:@(self.cm_width) forKey:@"cm_pageTitleViewWidth"];
    [self.cm_config setValue:self.parentController forKey:@"cm_parentController"];
    [self addMethodForParentController];
    self.cm_config.cm_font = self.cm_config.cm_font;
    self.cm_config.cm_titles = self.cm_config.cm_titles;
    self.cm_config.cm_titleMargin = self.cm_config.cm_titleMargin;
    self.cm_config.cm_contentMode = self.cm_config.cm_contentMode;
    
}

- (void)initVFLContraints {
    
    self.contentView.translatesAutoresizingMaskIntoConstraints = NO;
    self.titleView.translatesAutoresizingMaskIntoConstraints = NO;
    self.seperateline.translatesAutoresizingMaskIntoConstraints = NO;
    
    [NSLayoutConstraint activateConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[title]|" options:0 metrics:@{}views:@{@"title":self.titleView}]];
    [NSLayoutConstraint activateConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[seperateline]|" options:0 metrics:@{}views:@{@"seperateline":self.seperateline}]];
    [NSLayoutConstraint activateConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[content]|" options:0 metrics:@{}views:@{@"content":self.contentView}]];
    
    
    NSString *vf = self.cm_config.cm_fullScreen ? @"V:|[content]|" : @"V:|-(==titleTop)-[title(==titleH)][seperateline(==seperateH)][content]|";
    
    if (self.cm_config.cm_isFullScreen)
        [NSLayoutConstraint activateConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(==titleTop)-[title(==titleH)][seperateline(==seperateH)]" options:0 metrics:@{
            @"titleTop":@(self.cm_config.cm_titleTop),
            @"titleH":@(self.cm_config.cm_titleHeight),
            @"seperateH":@((self.cm_config.cm_additionalMode&CMPageTitleAdditionalMode_Seperateline) ? self.cm_config.cm_seperateLineHeight : 0)}views:@{
                @"title":self.titleView,
                @"seperateline":self.seperateline}]];
    
    
    [NSLayoutConstraint activateConstraints:[NSLayoutConstraint constraintsWithVisualFormat:vf options:0 metrics:@{ @"titleTop":@(self.cm_config.cm_titleTop),@"titleH":@(self.cm_config.cm_titleHeight),@"seperateH":@((self.cm_config.cm_additionalMode&CMPageTitleAdditionalMode_Seperateline) ? self.cm_config.cm_seperateLineHeight : 0)}views:@{@"title":self.titleView,@"seperateline":self.seperateline,@"content":self.contentView}]];
    
    
    if (self.cm_config.cm_rightView && self.cm_config.cm_contentMode != CMPageTitleContentMode_Right) {
        
        [self addSubview:self.cm_config.cm_rightView];
        self.cm_config.cm_rightView.translatesAutoresizingMaskIntoConstraints = NO;
        
        [NSLayoutConstraint activateConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[rightView(==width)]|" options:NSLayoutFormatAlignAllRight metrics:@{@"width":@(self.cm_config.cm_rightView.cm_width)}views:@{@"rightView":self.cm_config.cm_rightView}]];
        [NSLayoutConstraint activateConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(==mariginTop)-[rightView(==height)]" options:0 metrics:@{@"mariginTop":@((self.cm_config.cm_titleHeight - self.cm_config.cm_rightView.cm_height)*0.5 +self.cm_config.cm_titleTop),@"height":@(self.cm_config.cm_rightView.cm_height)}views:@{@"rightView":self.cm_config.cm_rightView}]];
    }
}




#pragma mark --- CMPageTitleContentViewDelegate

- (void)cm_pageTitleContentViewClickWithLastIndex:(NSUInteger)LastIndex Index:(NSUInteger)index Repeat:(BOOL)repeat {
    
    if (self.delegate && [self.delegate respondsToSelector:@selector(cm_pageTitleViewSelectedWithIndex:Repeat:)])
        [self.delegate cm_pageTitleViewSelectedWithIndex:index Repeat:repeat];
    
    if (self.delegate && [self.delegate respondsToSelector:@selector(cm_pageTitleViewClickWithIndex:Repeat:)])
        [self.delegate cm_pageTitleViewClickWithIndex:index Repeat:repeat];
    
    if (!repeat)  [self.contentView setContentOffset:CGPointMake(index * self.cm_width, 0)];
    if (!repeat) [self transtitonFromIndex:LastIndex TargetIndex:index];
    
}


#pragma mark --- CMPageContentViewDelegate

- (void)cm_pageContentViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
    [self.titleView cm_pageTitleContentViewAdjustPosition:scrollView];
}

- (void)cm_pageContentViewDidEndDeceleratingWithIndex:(NSInteger)index {
    if (self.titleView.cm_selectedIndex == index) return;
    [self transtitonFromIndex:self.titleView.cm_selectedIndex TargetIndex:index];
    self.titleView.cm_selectedIndex = index;
    if (self.delegate && [self.delegate respondsToSelector:@selector(cm_pageTitleViewSelectedWithIndex:Repeat:)])
        [self.delegate cm_pageTitleViewSelectedWithIndex:index Repeat:NO];
    
    if (self.delegate &&  [self.delegate respondsToSelector:@selector(cm_pageTitleViewScrollToIndex:)])
        [self.delegate cm_pageTitleViewScrollToIndex:index];
    
}


- (void)cm_pageContentViewDidScrollProgress:(CGFloat)progress LeftIndex:(NSUInteger)leftIndex RightIndex:(NSUInteger)rightIndex {
    
    [self.titleView cm_pageTitleViewDidScrollProgress:progress LeftIndex:leftIndex RightIndex:rightIndex];
    
}







- (BOOL)shouldAutomaticallyForwardAppearanceMethods{
    
    return NO;
}

- (void)endAppraranceFromIndex:(NSInteger)fromIndex TargetIndex:(NSInteger)targetIndex {
    
    NSInteger maxIndex = self.cm_config.cm_childControllers.count - 1;
    
    if ((fromIndex == maxIndex && targetIndex > maxIndex)|| (fromIndex == 0 && targetIndex<0)) return;
    
    UIViewController *fromController = self.cm_config.cm_childControllers[fromIndex];
    UIViewController *targetController = self.cm_config.cm_childControllers[targetIndex];
    
    if (fromIndex != targetIndex)  [fromController endAppearanceTransition];
    [targetController endAppearanceTransition];
    
}

- (void)beginAppearanceFromIndex:(NSInteger)fromIndex TargetIndex:(NSInteger)targetIndex {
    
    NSInteger maxIndex = self.cm_config.cm_childControllers.count - 1;
    if ((fromIndex == maxIndex && targetIndex > maxIndex)|| (fromIndex == 0 && targetIndex<0)) return;
    
    UIViewController *fromController = self.cm_config.cm_childControllers[fromIndex];
    UIViewController *targetController = self.cm_config.cm_childControllers[targetIndex];
    
    if (fromIndex != targetIndex) [fromController beginAppearanceTransition:NO animated:NO];
    [targetController beginAppearanceTransition:YES animated:NO];
    
}

- (void)transtitonFromIndex:(NSInteger)fromIndex TargetIndex:(NSInteger)targetIndex {
    [self beginAppearanceFromIndex:fromIndex TargetIndex:targetIndex];
    [self endAppraranceFromIndex:fromIndex TargetIndex:targetIndex];
}
- (void)addMethodForParentController {
    class_addMethod(self.cm_config.cm_parentController.class,NSSelectorFromString(@"shouldAutomaticallyForwardAppearanceMethods") , method_getImplementation(class_getInstanceMethod(self.class,NSSelectorFromString(@"shouldAutomaticallyForwardAppearanceMethods"))), "v@:");
    
}


@end


================================================
FILE: CMPageTitleView/CMPageTitleView/Class/CMPageTitleViewMacro.h
================================================
//
//  CMPageTitleViewMacro.h
//  CMPageTitleView
//
//  GitHub 下载地址:https://github.com/CrabMen/CMPageTitleView
//

//  Created by 智借iOS on 2019/5/9.
//  Copyright © 2019 CrabMan. All rights reserved.
//

#ifndef CMPageTitleViewMacro_h
#define CMPageTitleViewMacro_h

// 过期提醒
#define CMPageDeprecated(instead) NS_DEPRECATED(2_0, 2_0, 2_0, 2_0, instead)

//断言
#define CMPageErrorAssert(condition,message) NSAssert(condition,message)



#endif /* CMPageTitleViewMacro_h */


================================================
FILE: CMPageTitleView/CMPageTitleView/Class/UIView+CMCommon.h
================================================
//
//  UIView+Common.h
//  EBan
//
//  GitHub 下载地址:https://github.com/CrabMen/CMPageTitleView
//

//  Created by CrabMan on 16/9/18.
//  Copyright © 2016年 CrabMan. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface UIView (CMCommon)


@property (nonatomic, assign) CGFloat cm_x;
@property (nonatomic, assign) CGFloat cm_y;
@property (nonatomic, assign) CGFloat cm_centerX;
@property (nonatomic, assign) CGFloat cm_centerY;

@property (nonatomic, assign) CGFloat cm_width;
@property (nonatomic, assign) CGFloat cm_height;
@property (nonatomic, assign) CGPoint cm_origin;
@property (nonatomic, assign) CGSize  cm_size;

@property (readonly) CGPoint cm_bottomLeft;
@property (readonly) CGPoint cm_bottomRight;
@property (readonly) CGPoint cm_topRight;

@property CGFloat cm_top;
@property CGFloat cm_left;

@property CGFloat cm_bottom;
@property CGFloat cm_right;

/**当前所在的UINavigationConntroller*/
@property (nonatomic,strong,readonly) UINavigationController *cm_navigationController;

/**当前所在的UIViewController*/
@property (nonatomic,strong,readonly) UINavigationController *cm_viewController;

@end


================================================
FILE: CMPageTitleView/CMPageTitleView/Class/UIView+CMCommon.m
================================================
//
//  UIView+Common.m
//  EBan
//
//  GitHub 下载地址:https://github.com/CrabMen/CMPageTitleView
//
//  Created by CrabMan on 16/9/18.
//  Copyright © 2016年 CrabMan. All rights reserved.
//

#import "UIView+CMCommon.h"

@implementation UIView (CMCommon)


- (CGFloat)cm_x{
    return self.frame.origin.x;
}

- (void)setCm_x:(CGFloat)cm_x{
    CGRect frame = self.frame;
    frame.origin.x = cm_x;
    self.frame = frame;
}

- (CGFloat)cm_y{
    return self.frame.origin.y;
}

- (void)setCm_y:(CGFloat)cm_y{
    CGRect frame = self.frame;
    frame.origin.y = cm_y;
    self.frame = frame;
}


- (CGFloat)cm_width{
    return self.frame.size.width;
}

- (void)setCm_width:(CGFloat)cm_width{
    CGRect frame = self.frame;
    frame.size.width = cm_width;
    self.frame = frame;
}

- (CGFloat)cm_height{
    return self.frame.size.height;
}

- (void)setCm_height:(CGFloat)cm_height{
    CGRect frame = self.frame;
    frame.size.height = cm_height;
    self.frame = frame;
}


- (CGFloat)cm_centerX{
    return self.center.x;
}

- (void)setCm_centerX:(CGFloat)cm_centerX{
    CGPoint center = self.center;
    center.x = cm_centerX;
    self.center = center;
}

- (CGFloat)cm_centerY{
    return self.center.y;
}

- (void)setCm_centerY:(CGFloat)cm_centerY{
    CGPoint center = self.center;
    center.y = cm_centerY;
    self.center = center;
}

- (CGPoint)cm_origin{
    return self.frame.origin;
}

- (void)setCm_origin:(CGPoint)cm_origin{
    CGRect frame = self.frame;
    frame.origin = cm_origin;
    self.frame = frame;
}

- (CGSize)cm_size{
    return self.frame.size;
}

- (void)setCm_size:(CGSize)cm_size{
    CGRect frame = self.frame;
    frame.size = cm_size;
    self.frame = frame;
}

// Query other frame locations
- (CGPoint) cm_bottomRight{
    CGFloat x = self.frame.origin.x + self.frame.size.width;
    CGFloat y = self.frame.origin.y + self.frame.size.height;
    return CGPointMake(x, y);
}

- (CGPoint) cm_bottomLeft{
    CGFloat x = self.frame.origin.x;
    CGFloat y = self.frame.origin.y + self.frame.size.height;
    return CGPointMake(x, y);
}

- (CGPoint)cm_topRight{
    CGFloat x = self.frame.origin.x + self.frame.size.width;
    CGFloat y = self.frame.origin.y;
    return CGPointMake(x, y);
}

// Retrieve and set top, bottom, left, right

- (CGFloat) cm_top{
    return self.frame.origin.y;
}

- (void) setCm_top:(CGFloat)cm_top{
    CGRect newframe = self.frame;
    newframe.origin.y = cm_top;
    self.frame = newframe;
}

- (CGFloat)cm_left{
    return self.frame.origin.x;
}

- (void)setCm_left:(CGFloat)cm_left{
    CGRect newframe = self.frame;
    newframe.origin.x = cm_left;
    self.frame = newframe;
}

- (CGFloat)cm_bottom{
    return self.frame.origin.y + self.frame.size.height;
}

- (void)setCm_bottom:(CGFloat)cm_bottom{
    CGRect newframe = self.frame;
    newframe.origin.y = cm_bottom - self.frame.size.height;
    self.frame = newframe;
}

- (CGFloat)cm_right{
    return self.frame.origin.x + self.frame.size.width;
}

- (void)setCm_right:(CGFloat)cm_right{
    CGFloat delta = cm_right - (self.frame.origin.x + self.frame.size.width);
    CGRect newframe = self.frame;
    newframe.origin.x += delta ;
    self.frame = newframe;
}


-(UINavigationController *)cm_navigationController {
    return (self.cm_viewController ? (self.cm_viewController.navigationController ?: nil): nil);
}

- (UIViewController *)cm_viewController {
    UIResponder *next = self.nextResponder;
    do {
        if ([next isKindOfClass:[UIViewController class]]) {
            return (UIViewController *)next;
        }
        next = next.nextResponder;
    }while(next != nil);
    
    return nil;
}
@end


================================================
FILE: CMPageTitleView/CMPageTitleView/Demo/CMChildTableController.h
================================================
//
//  CMChildController.h
//  CMPageTitleView
//
//  Created by 郭强 on 2019/12/14.
//  Copyright © 2019 CrabMan. All rights reserved.
//

#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface CMChildTableController : UITableViewController

@property (nonatomic,assign) CGFloat topInset;


@end

NS_ASSUME_NONNULL_END


================================================
FILE: CMPageTitleView/CMPageTitleView/Demo/CMChildTableController.m
================================================
//
//  CMChildController.m
//  CMPageTitleView
//
//  Created by 郭强 on 2019/12/14.
//  Copyright © 2019 CrabMan. All rights reserved.
//

#import "CMChildTableController.h"
#import <Masonry.h>
#import "MJRefresh.h"
@interface CMChildTableController ()

@property(nonatomic,weak) UIButton *button;


@end

@implementation CMChildTableController

- (void)setTopInset:(CGFloat)topInset {
    
    _topInset = topInset;
    
    if (topInset) {
        self.tableView.contentInset = UIEdgeInsetsMake(44, 0, 0, 0);
        if (@available(iOS 11.0, *)) {
            self.tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
        } else {
            self.automaticallyAdjustsScrollViewInsets = NO;
        }
    } else {
        self.tableView.contentInset = UIEdgeInsetsZero;
    }
}


- (UIButton *)button {
    if (!_button) {
        UIButton *button = [UIButton new];
        [button setTitle:@"跳转到详情" forState:UIControlStateNormal];
        [button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
        button.layer.cornerRadius = 4;
        button.backgroundColor = [UIColor lightGrayColor];
        [button addTarget:self action:@selector(buttonnClickAction:) forControlEvents:UIControlEventTouchUpInside];
        _button = button;
        [self.view addSubview:_button];
    }
    return _button;
    
}

- (void)buttonnClickAction:(UIButton *)sender {
    
    UIViewController *detailVC = [UIViewController new];
    detailVC.title = @"详情页";
    detailVC.view.backgroundColor = UIColor.redColor;
    [self.parentViewController.navigationController pushViewController:detailVC animated:YES];
}


- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"viewDidLoad --- %@",self.title);
    
    
}

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    NSLog(@"viewWillAppear --- %@",self.title);
    
    
    if (self.topInset) {
        self.tableView.contentInset = UIEdgeInsetsMake(44, 0, 0, 0);
        self.tableView.mj_header = nil;
    } else {
        self.tableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
                   dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                       [self.tableView.mj_header endRefreshing];
                       
                   });
               } ];
        self.tableView.contentInset = UIEdgeInsetsZero;
    }
    
    if (self.tableView.mj_header) {
        [self.tableView.mj_header beginRefreshing];
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            [self.tableView.mj_header endRefreshing];
            
        });
    }
    
#warning --- scrollview下沉问题,请添加以下代码
    
    if (@available(iOS 11.0, *)) {
        self.tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
    } else {
        self.automaticallyAdjustsScrollViewInsets = NO;
    }
    
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    NSLog(@"viewWillDisappear --- %@",self.title);
    
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    NSLog(@"viewDidAppear --- %@",self.title);
    
}

- (void)viewDidDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    NSLog(@"viewDidDisappear --- %@",self.title);
    
}



- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    
    
    return 100;
    
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass(self.class)];
    
    if (!cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:NSStringFromClass(self.class)];
    }
    
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:NSStringFromClass(self.class)];
    cell.textLabel.text = [NSString stringWithFormat:@"-------> %@ -- 第%ld行 <------- ",self.title,indexPath.row];
    cell.textLabel.font = [UIFont systemFontOfSize:18];
    cell.textLabel.textColor = UIColor.blackColor;
    cell.backgroundColor = [UIColor colorWithWhite:1 alpha:0];
    return  cell;
    
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    
    UIViewController *detailVC = [UIViewController new];
    detailVC.title = @"详情页";
    detailVC.view.backgroundColor = UIColor.redColor;
    [self.parentViewController.navigationController pushViewController:detailVC animated:YES];
}


/*
 #pragma mark - Navigation
 
 // In a storyboard-based application, you will often want to do a little preparation before navigation
 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
 // Get the new view controller using [segue destinationViewController].
 // Pass the selected object to the new view controller.
 }
 */

@end


================================================
FILE: CMPageTitleView/CMPageTitleView/Demo/CMMainTableController.h
================================================
//
//  CMMainTableController.h
//  CMPageTitleView
//
//  Created by CrabMan on 2019/4/10.
//  Copyright © 2019 CrabMan. All rights reserved.
//

#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface CMMainTableController : UITableViewController

@end

NS_ASSUME_NONNULL_END


================================================
FILE: CMPageTitleView/CMPageTitleView/Demo/CMMainTableController.m
================================================
//
//  CMMainTableController.m
//  CMPageTitleView
//
//  Created by CrabMan on 2019/4/10.
//  Copyright © 2019 CrabMan. All rights reserved.
//

#import "CMMainTableController.h"
#import "CMViewController.h"
@interface CMMainTableController ()

/**样式数组*/
@property (nonatomic,strong) NSArray *styleArray;

/**组合效果*/
@property (nonatomic,strong) NSArray *mixStyleArray;


@end

@implementation CMMainTableController


-(NSArray *)styleArray {
    if (!_styleArray) {
        _styleArray =@[@{
                           @"title":@"基本样式",
                           @"array":@[
                                   
                                   @"颜色效果 - RGB渐变",
                                   @"颜色效果 - 填充渐变",
                                   @"颜色效果 - 无渐变",
                                   
                                   @"切换样式 - 字体放大",
                                   @"切换样式 - 下划线",
                                   @"切换样式 - 遮罩",
                                   @"切换样式 - 字体放大 - 延迟",
                                   @"切换样式 - 下划线 - 延迟",
                                   @"切换样式 - 遮罩 - 延迟",
                                   
                                   @"附加效果 - 标题栏下方分割线",
                                   @"附加效果 - 标题文字之间分割线",
                                   
                                   @"对齐方式 -- 左对齐",
                                   @"对齐方式 -- 右对齐",
                                   @"对齐方式 -- 居中",
                                   @"对齐方式 -- SpaceAround",
                                   
                                   @"字体放大效果时对其方式 -- 居中对齐(默认)",
                                   @"字体放大效果时对其方式 -- 上对齐",
                                   @"字体放大效果时对其方式 -- 下对齐"
                                   
                                   ]},
                       
                       @{
                           @"title":@"组合样式",
                           @"array":@[
                                   
                                   @"字体放大 - 颜色RGB渐变",
                                   @"字体放大 - 颜色填充渐变",
                                   @"字体放大 - 颜色无渐变",
                                   @"字体放大(延迟) - 颜色RGB渐变",
                                   @"字体放大(延迟) - 颜色填充渐变",
                                   @"字体放大(延迟) - 颜色无渐变",
                                   
                                   @"下划线 - 颜色RGB渐变",
                                   @"下划线 - 颜色填充渐变",
                                   @"下划线 - 颜色无渐变",
                                   @"下划线(延迟) - 颜色RGB渐变",
                                   @"下划线(延迟) - 颜色填充渐变",
                                   @"下划线(延迟) - 颜色无渐变",
                                   
                                   @"下划线(固定宽度)- 颜色RGB渐变",
                                   @"下划线(固定宽度)- 颜色填充渐变",
                                   @"下划线(固定宽度)- 颜色无渐变",
                                   @"下划线(延迟 && 固定宽度)- 颜色RGB渐变",
                                   @"下划线(延迟 && 固定宽度)- 颜色填充渐变",
                                   @"下划线(延迟 && 固定宽度)- 颜色无渐变",
                                   
                                   @"下划线(比例宽度)- 颜色RGB渐变",
                                   @"下划线(比例宽度)- 颜色填充渐变",
                                   @"下划线(比例宽度)- 颜色无渐变",
                                   @"下划线(延迟 && 比例宽度)- 颜色RGB渐变",
                                   @"下划线(延迟 && 比例宽度)- 颜色填充渐变",
                                   @"下划线(延迟 && 比例宽度)- 颜色无渐变",
                                   
                                   @"下划线(延展)- 颜色RGB渐变",
                                   @"下划线(延展)- 颜色填充渐变",
                                   @"下划线(延展)- 颜色无渐变",
                                   @"下划线(延展 && 固定宽度)- 颜色RGB渐变",
                                   @"下划线(延展 && 固定宽度)- 颜色填充渐变",
                                   @"下划线(延展 && 固定宽度)- 颜色无渐变",
                                   @"下划线(延展 && 比例宽度)- 颜色RGB渐变",
                                   @"下划线(延展 && 比例宽度)- 颜色填充渐变",
                                   @"下划线(延展 && 比例宽度)- 颜色无渐变",
                                   
                                   @"遮罩 - 颜色RGB渐变",
                                   @"遮罩 - 颜色填充渐变",
                                   @"遮罩 - 颜色无渐变",
                                   @"遮罩(延迟) - 颜色RGB渐变",
                                   @"遮罩(延迟) - 颜色填充渐变",
                                   @"遮罩(延迟) - 颜色无渐变",
                                   
                                   @"遮罩(固定宽度)- 颜色RGB渐变",
                                   @"遮罩(固定宽度)- 颜色填充渐变",
                                   @"遮罩(固定宽度)- 颜色无渐变",
                                   @"遮罩(延迟 && 固定宽度)- 颜色RGB渐变",
                                   @"遮罩(延迟 && 固定宽度)- 颜色填充渐变",
                                   @"遮罩(延迟 && 固定宽度)- 颜色无渐变",
                                   
                                   @"字体放大 && 下划线 - 颜色填充渐变",
                                   @"字体放大 && 下划线 && 延迟 - 颜色无渐变",
                                   
                                   @"字体放大 && 下划线(延展)- 颜色填充渐变",
                                   @"字体放大 && 下划线(延展 && 固定宽度 )- 颜色填充渐变",
                                   @"字体放大 && 下划线(延展 && 比例宽度 )-颜色填充渐变",
                                   @"字体放大 && 下划线(延展 && 放大时下对齐 )-颜色填充渐变",
                                   @"字体放大 && 下划线(延展 && 放大时下对齐 && 左对齐)-颜色填充渐变",
                                   
                                   
                                   ]
                           },
                       
                       
                       @{
                           @"title":@"其他样式",
                           @"array":@[
                                   @"标题栏背景色",
                                   @"标题栏背景图片",
                                   @"rightView",
                                   @"全屏穿透样式",
                                   @"全屏穿透样式(标题栏偏移)",
                                   @"对齐方式(Space arround)",
                                   ]},
                       
                       ];
        
        
        
        
    }
    
    return _styleArray;
}



- (void)viewDidLoad {
    [super viewDidLoad];
    
    
    self.title = @"CMPageTitleView";
    [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"];
    
}


#pragma mark - Table view data source

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    
    
    UIView *header = [[UIView alloc] initWithFrame:CGRectMake(0, 0,self.view.bounds.size.width, 40)];
    header.backgroundColor = [UIColor lightGrayColor];
    
    UILabel *label = [[UILabel alloc] initWithFrame:header.bounds];
    
    label.textColor = [UIColor blackColor];
    
    label.font = [UIFont boldSystemFontOfSize:18];
    
    label.text = self.styleArray[section][@"title"];
    
    label.textAlignment = NSTextAlignmentCenter;
    
    [header addSubview:label];
    
    return header;
    
}

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    
    return 40;
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    
    return self.styleArray.count;
    
}


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    
    
    return [self.styleArray[section][@"array"] count];
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
    
    cell.textLabel.text = [NSString stringWithFormat:@"%02ld-%02ld.%@",indexPath.section,indexPath.row,self.styleArray[indexPath.section][@"array"][indexPath.row]];
    cell.textLabel.numberOfLines = 0;
    cell.textLabel.font = [UIFont systemFontOfSize:14];
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    CMViewController *vc = [CMViewController new];
    SEL selector = NSSelectorFromString([NSString stringWithFormat:@"style%02ld_%02ld",indexPath.section,indexPath.row]);
    [vc performSelector:selector];
    
    [self.navigationController pushViewController:vc animated:YES];
}
/*
 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:<#@"reuseIdentifier"#> forIndexPath:indexPath];
 
 // Configure the cell...
 
 return cell;
 }
 */

/*
 // Override to support conditional editing of the table view.
 - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
 // Return NO if you do not want the specified item to be editable.
 return YES;
 }
 */

/*
 // Override to support editing the table view.
 - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
 if (editingStyle == UITableViewCellEditingStyleDelete) {
 // Delete the row from the data source
 [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
 } else if (editingStyle == UITableViewCellEditingStyleInsert) {
 // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
 }
 }
 */

/*
 // Override to support rearranging the table view.
 - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {
 }
 */

/*
 // Override to support conditional rearranging of the table view.
 - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath {
 // Return NO if you do not want the item to be re-orderable.
 return YES;
 }
 */

/*
 #pragma mark - Navigation
 
 // In a storyboard-based application, you will often want to do a little preparation before navigation
 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
 // Get the new view controller using [segue destinationViewController].
 // Pass the selected object to the new view controller.
 }
 */

@end


================================================
FILE: CMPageTitleView/CMPageTitleView/Demo/CMViewController.h
================================================
//
//  CMViewController.h
//  CMPageTitleView
//
//  Created by CrabMan on 2019/4/10.
//  Copyright © 2019 CrabMan. All rights reserved.
//

#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface CMViewController : UIViewController


@end

NS_ASSUME_NONNULL_END


================================================
FILE: CMPageTitleView/CMPageTitleView/Demo/CMViewController.m
================================================
//
//  CMViewController.m
//  CMPageTitleView
//
//  Created by CrabMan on 2019/4/10.
//  Copyright © 2019 CrabMan. All rights reserved.
//

#import "CMViewController.h"
#import "CMPageTitleView.h"
#import "CMChildTableController.h"
#import "Masonry.h"

//是否是刘海屏
#define CM_NOTCH_SCREEN \
({BOOL isPhoneX = NO;\
if (@available(iOS 11.0, *)) {\
isPhoneX = [[UIApplication sharedApplication] delegate].window.safeAreaInsets.bottom > 0.0;\
}\
(isPhoneX);})

#define CM_Interface_Portrait UIInterfaceOrientationIsPortrait([UIApplication sharedApplication].statusBarOrientation)

//屏幕尺寸
#define CM_SCREEN_W   [UIScreen mainScreen].bounds.size.width
#define CM_SCREEN_H  [UIScreen mainScreen].bounds.size.height


//导航栏高度
#define CM_NAVI_BAR_H (CM_Interface_Portrait ? (CM_NOTCH_SCREEN ? 88 : 64) : (CM_NOTCH_SCREEN ? 44 : 44))

//电池条高度
#define CM_STATUE_BAR_H (CM_Interface_Portrait ? (CM_NOTCH_SCREEN ? 44 : 20):0)

//tabbar高度
#define CM_TAB_BAR_H (CM_NOTCH_SCREEN ? 83.0f: 49.0)


//随机色
#define CM_RANDOM_COLOR [UIColor colorWithRed:arc4random_uniform(256)/255.0 green:arc4random_uniform(256)/255.0 blue:arc4random_uniform(256)/255.0 alpha:1.0]



@interface CMViewController ()<CMPageTitleViewDelegate>

/**视图控制器数组*/
@property (nonatomic,copy) NSArray *childControllers;

/**个数较少的视图控制器数组*/
@property (nonatomic,strong) NSArray *lessChildControllers;

@property (nonatomic,strong) NSArray *twoControllers;

@property (nonatomic,weak) UIImageView *imageView;

/**default notes*/
@property (nonatomic,weak) CMPageTitleView *pageTitleView;

/**default note*/
@property (nonatomic,strong) UIImageView *rightView;


@end

@implementation CMViewController

- (UIImageView *)rightView {
    
    if (!_rightView) {
        _rightView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 60, 66)];
        //        _rightView.alpha = 0.75;
        _rightView.backgroundColor = UIColor.lightGrayColor;
        _rightView.image = [UIImage imageNamed:@"add"];
        _rightView.contentMode = UIViewContentModeScaleAspectFit;
        _rightView.userInteractionEnabled = YES;
        UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGesture:)];
        [_rightView addGestureRecognizer:tap];
    }
    return _rightView;
}

- (CMPageTitleView *)pageTitleView {
    if (!_pageTitleView) {
        CMPageTitleView *pageTitleView = [[CMPageTitleView alloc] init];
        
        _pageTitleView = pageTitleView;
        [self.view addSubview:_pageTitleView];
        
    }
    
    return _pageTitleView;
    
}
- (UIImageView *)imageView {
    
    if (!_imageView) {
        UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"background_image"]];
        
        _imageView = imageView;
        
        [self.view addSubview:_imageView];
    }
    
    return _imageView;
}

- (NSArray *)lessChildControllers {
    
    return [self.childControllers subarrayWithRange:NSMakeRange(0, 3)];
    
    
}


- (NSArray *)twoControllers {
    
    return [self.childControllers subarrayWithRange:NSMakeRange(0, 2)];
    
    
}

- (NSArray *)childControllers {
    
    if (!_childControllers) {
        CMChildTableController *vc0 = [CMChildTableController new];
        CMChildTableController *vc1 = [CMChildTableController new];
        CMChildTableController *vc2 = [CMChildTableController new];
        CMChildTableController *vc3 = [CMChildTableController new];
        CMChildTableController *vc4 = [CMChildTableController new];
        CMChildTableController *vc5 = [CMChildTableController new];
        CMChildTableController *vc6 = [CMChildTableController new];
        CMChildTableController *vc7 = [CMChildTableController new];
        CMChildTableController *vc8 = [CMChildTableController new];
        CMChildTableController *vc9 = [CMChildTableController new];
        CMChildTableController *vc10 = [CMChildTableController new];
        
        vc0.title = @"推荐";
        vc1.title = @"小视频";
        vc2.title = @"视频";
        vc3.title = @"懂车帝";
        vc4.title = @"北京";
        vc5.title = @"娱乐";
        vc6.title = @"图片";
        vc7.title = @"热点";
        vc8.title = @"体育";
        vc9.title = @"财经";
        vc10.title = @"国际";
        
        
        vc0.view.backgroundColor = CM_RANDOM_COLOR;
        vc1.view.backgroundColor = CM_RANDOM_COLOR;
        vc2.view.backgroundColor = CM_RANDOM_COLOR;
        vc3.view.backgroundColor = CM_RANDOM_COLOR;
        vc4.view.backgroundColor = CM_RANDOM_COLOR;
        vc5.view.backgroundColor = CM_RANDOM_COLOR;
        vc6.view.backgroundColor = CM_RANDOM_COLOR;
        vc7.view.backgroundColor = CM_RANDOM_COLOR;
        vc8.view.backgroundColor = CM_RANDOM_COLOR;
        vc9.view.backgroundColor = CM_RANDOM_COLOR;
        vc10.view.backgroundColor = CM_RANDOM_COLOR;
        
        _childControllers =@[vc0,vc1,vc2,vc3,vc4,vc5,vc6,vc7];
        
    }
    
    return _childControllers;
}

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    
    self.view.backgroundColor = [UIColor whiteColor];
    
    [self setReloadBarButtonItem];
    
    
    if (@available(iOS 11.0, *)) {
        self.automaticallyAdjustsScrollViewInsets = UIScrollViewContentInsetAdjustmentNever;
    } else {
        // Fallback on earlier versions
        self.automaticallyAdjustsScrollViewInsets = NO;
    }
    
    
    [self.pageTitleView mas_remakeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
}



- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator{
    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
    
    CGFloat naviH = (size.height > size.width ? (CM_NOTCH_SCREEN ? 88 : 64) : (CM_NOTCH_SCREEN ? 44 : 44));
    [self.pageTitleView mas_remakeConstraints:^(MASConstraintMaker *make) {
        make.left.right.bottom.mas_equalTo(0);
        make.top.mas_equalTo(naviH);
    }];
}

- (void)setReloadBarButtonItem {
    
    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"刷新数据" style:UIBarButtonItemStyleDone target:self action:@selector(reloadConfig:)];
    
    
    
}

- (void)reloadConfig:(UIBarButtonItem *)sender {
    
    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.lessChildControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Underline;
    config.cm_underlineStretch = YES;
    config.cm_gradientStyle = CMTitleColorGradientStyle_RGB;
    config.cm_contentMode = CMPageTitleContentMode_Left;
    config.cm_additionalMode = CMPageTitleAdditionalMode_Seperateline;
//    config.cm_scaleGradientContentMode = CMPageTitleScaleGradientContentMode_Bottom;
    config.cm_scale = 1.3;
    config.cm_defaultIndex = 1;
    config.cm_selectedColor = UIColor.blueColor;
    config.cm_underlineColor = UIColor.blueColor;
    self.pageTitleView.cm_config = config;
    
    [self.lessChildControllers setValue:@(0) forKey:@"topInset"];
    [self.pageTitleView cm_reloadConfig];
    
    
}

- (void)tapGesture:(UITapGestureRecognizer *)gesture {
    
    //do something ...
    NSLog(@"****右侧视图被点击****");
    
}


- (void)style00_00 {
    
    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;
    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_gradientStyle = CMTitleColorGradientStyle_RGB;
    
    self.pageTitleView.cm_config = config;
    
}

- (void)style00_01 {
    
    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;
    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_gradientStyle = CMTitleColorGradientStyle_Fill;
    
    self.pageTitleView.cm_config = config;
    
}

- (void)style00_02 {
    
    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;
    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    
    self.pageTitleView.cm_config = config;
    
}

- (void)style00_03 {
    
    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;
    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Scale;
    //默认放大倍数是1.2
    // 可以通过下方代码自定义
    //    config.cm_font = [UIFont systemFontOfSize:16]
    //    config.cm_selectedFont = [UIFont systemFontOfSize:18];
    //或者
    //    config.cm_font = [UIFont systemFontOfSize:16]
    //    config.cm_scale = 1.3;
    
    self.pageTitleView.cm_config = config;
    
}

- (void)style00_04 {
    
    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;
    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Underline;
    
    self.pageTitleView.cm_config = config;
    
}

- (void)style00_05 {
    
    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;
    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Cover;
    
    self.pageTitleView.cm_config = config;
    
}

- (void)style00_06 {
    
    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;
    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Scale | CMPageTitleSwitchMode_Delay ;
    //默认放大倍数是1.2
    // 可以通过下方代码自定义
    //    config.cm_font = [UIFont systemFontOfSize:16]
    //    config.cm_selectedFont = [UIFont systemFontOfSize:18];
    //或者
    //    config.cm_font = [UIFont systemFontOfSize:16]
    //    config.cm_scale = 1.3;
    
    self.pageTitleView.cm_config = config;
    
}

- (void)style00_07 {
    
    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;
    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Underline | CMPageTitleSwitchMode_Delay;
    
    self.pageTitleView.cm_config = config;
    
}

- (void)style00_08 {
    
    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;
    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Cover | CMPageTitleSwitchMode_Delay;
    
    self.pageTitleView.cm_config = config;
    
}

- (void)style00_09 {
    
    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;
    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_additionalMode = CMPageTitleAdditionalMode_Seperateline;
    config.cm_seperateLineHeight = 2;
    self.pageTitleView.cm_config = config;
    
}

- (void)style00_10 {
    
    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;
    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_additionalMode = CMPageTitleAdditionalMode_Splitter;
    config.cm_splitterSize = CGSizeMake(1/[UIScreen mainScreen].scale, config.cm_titleHeight * 0.5);
    
    self.pageTitleView.cm_config = config;
    
}

- (void)style00_11 {
    
    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    
    self.pageTitleView.delegate = self;
    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.lessChildControllers;
    config.cm_contentMode = CMPageTitleContentMode_Left;
    
    self.pageTitleView.cm_config = config;
    
}

- (void)style00_12 {
    
    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    
    self.pageTitleView.delegate = self;
    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.lessChildControllers;
    config.cm_contentMode = CMPageTitleContentMode_Right;
    
    self.pageTitleView.cm_config = config;
}

- (void)style00_13 {
    
    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    
    self.pageTitleView.delegate = self;
    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.lessChildControllers;
    
    self.pageTitleView.cm_config = config;
}

- (void)style00_14 {
    
    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    
    self.pageTitleView.delegate = self;
    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.lessChildControllers;
    config.cm_contentMode = CMPageTitleContentMode_SpaceAround;
    
    self.pageTitleView.cm_config = config;
}

- (void)style00_15 {
    
    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    
    self.pageTitleView.delegate = self;
    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Scale;
    //    默认
    //    config.cm_scaleGradientContentMode = CMPageTitleScaleGradientContentMode_Center;
    self.pageTitleView.cm_config = config;
    
}

- (void)style00_16 {
    
    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    
    self.pageTitleView.delegate = self;
    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Scale;
    config.cm_scaleGradientContentMode = CMPageTitleScaleGradientContentMode_Top;
    self.pageTitleView.cm_config = config;
    
}

- (void)style00_17 {
    
    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    
    self.pageTitleView.delegate = self;
    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Scale;
    config.cm_scaleGradientContentMode = CMPageTitleScaleGradientContentMode_Bottom;
    
    self.pageTitleView.cm_config = config;
    
}


- (void)style01_00 {
    
    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;
    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Scale;
    config.cm_gradientStyle = CMTitleColorGradientStyle_RGB;
    
    self.pageTitleView.cm_config = config;
    
}

- (void)style01_01 {
    
    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;
    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Scale;
    config.cm_gradientStyle = CMTitleColorGradientStyle_Fill;
    
    self.pageTitleView.cm_config = config;
    
}

- (void)style01_02 {
    
    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;
    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Scale;
    config.cm_gradientStyle = CMTitleColorGradientStyle_None;
    
    self.pageTitleView.cm_config = config;
    
}

- (void)style01_03 {
    
    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;
    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Scale | CMPageTitleSwitchMode_Delay;
    config.cm_gradientStyle = CMTitleColorGradientStyle_RGB;
    
    self.pageTitleView.cm_config = config;
    
    
}

- (void)style01_04 {
    
    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;
    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Scale | CMPageTitleSwitchMode_Delay;
    config.cm_gradientStyle = CMTitleColorGradientStyle_Fill;
    
    self.pageTitleView.cm_config = config;
    
    
    
}

- (void)style01_05 {
    
    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;
    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Scale | CMPageTitleSwitchMode_Delay;
    config.cm_gradientStyle = CMTitleColorGradientStyle_None;
    
    self.pageTitleView.cm_config = config;
    
}

- (void)style01_06 {
    

    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;

    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Underline;
    config.cm_gradientStyle = CMTitleColorGradientStyle_RGB;
    
    self.pageTitleView.cm_config = config;
    
    
    
}

- (void)style01_07 {
    

    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;

    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Underline;
    config.cm_gradientStyle = CMTitleColorGradientStyle_Fill;
    
    self.pageTitleView.cm_config = config;
    
}

- (void)style01_08 {
    

    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;

    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Underline;
    config.cm_gradientStyle = CMTitleColorGradientStyle_None;
    
    self.pageTitleView.cm_config = config;
}

- (void)style01_09 {
    

    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;

    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Underline | CMPageTitleSwitchMode_Delay;
    config.cm_gradientStyle = CMTitleColorGradientStyle_RGB;
    
    self.pageTitleView.cm_config = config;
    
}

- (void)style01_10 {
    

    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;

    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Underline | CMPageTitleSwitchMode_Delay;
    config.cm_gradientStyle = CMTitleColorGradientStyle_Fill;
    
    self.pageTitleView.cm_config = config;
    
}

- (void)style01_11 {
    

    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;

    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Underline | CMPageTitleSwitchMode_Delay;
    config.cm_gradientStyle = CMTitleColorGradientStyle_None;
    
    self.pageTitleView.cm_config = config;
    
    
}

- (void)style01_12 {
    

    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;

    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Underline;
    config.cm_underlineWidth = 10;
    config.cm_gradientStyle = CMTitleColorGradientStyle_RGB;
    
    self.pageTitleView.cm_config = config;
    
}

- (void)style01_13 {
    

    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;

    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Underline;
    config.cm_underlineWidth = 10;
    config.cm_gradientStyle = CMTitleColorGradientStyle_Fill;
    
    self.pageTitleView.cm_config = config;
    
}

- (void)style01_14 {
    

    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;

    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Underline;
    config.cm_underlineWidth = 10;
    config.cm_gradientStyle = CMTitleColorGradientStyle_None;
    
    self.pageTitleView.cm_config = config;
}

- (void)style01_15 {
    

    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;

    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Underline | CMPageTitleSwitchMode_Delay;
    config.cm_underlineWidth = 10;
    config.cm_gradientStyle = CMTitleColorGradientStyle_RGB;
    
    self.pageTitleView.cm_config = config;
    
}

- (void)style01_16 {
    

    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;

    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Underline | CMPageTitleSwitchMode_Delay;
    config.cm_underlineWidth = 10;
    config.cm_gradientStyle = CMTitleColorGradientStyle_Fill;
    
    self.pageTitleView.cm_config = config;
    
}

- (void)style01_17 {
    

    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;

    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Underline | CMPageTitleSwitchMode_Delay;
    config.cm_underlineWidth = 10;
    config.cm_gradientStyle = CMTitleColorGradientStyle_None;
    
    self.pageTitleView.cm_config = config;
    
}

- (void)style01_18 {
    

    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;

    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Underline;
    config.cm_underlineWidthScale = 0.6;
    
    config.cm_gradientStyle = CMTitleColorGradientStyle_RGB;
    
    self.pageTitleView.cm_config = config;
    
}

- (void)style01_19 {
    

    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;

    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Underline;
    config.cm_underlineWidthScale = 0.6;
    config.cm_gradientStyle = CMTitleColorGradientStyle_Fill;
    
    self.pageTitleView.cm_config = config;
    
}

- (void)style01_20 {
    

    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;

    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Underline;
    config.cm_underlineWidthScale = 0.6;
    config.cm_gradientStyle = CMTitleColorGradientStyle_None;
    
    self.pageTitleView.cm_config = config;
    
}

- (void)style01_21 {
    

    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;

    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Underline | CMPageTitleSwitchMode_Delay;
    config.cm_underlineWidthScale = 0.6;
    
    config.cm_gradientStyle = CMTitleColorGradientStyle_RGB;
    
    self.pageTitleView.cm_config = config;
    
}

- (void)style01_22 {
    

    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;

    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Underline | CMPageTitleSwitchMode_Delay;
    config.cm_underlineWidthScale = 0.6;
    config.cm_gradientStyle = CMTitleColorGradientStyle_Fill;
    
    self.pageTitleView.cm_config = config;
    
}

- (void)style01_23 {
    

    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;

    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Underline | CMPageTitleSwitchMode_Delay;
    config.cm_underlineWidthScale = 0.6;
    config.cm_gradientStyle = CMTitleColorGradientStyle_None;
    
    self.pageTitleView.cm_config = config;
    
}

- (void)style01_24 {
    

    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;

    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Underline;
    config.cm_underlineStretch = YES;
    
    config.cm_gradientStyle = CMTitleColorGradientStyle_RGB;
    
    self.pageTitleView.cm_config = config;
    
}

- (void)style01_25 {
    

    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;

    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Underline;
    config.cm_underlineStretch = YES;
    config.cm_gradientStyle = CMTitleColorGradientStyle_Fill;
    
    self.pageTitleView.cm_config = config;
    
}

- (void)style01_26 {
    

    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;

    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Underline;
    config.cm_underlineStretch = YES;
    config.cm_gradientStyle = CMTitleColorGradientStyle_None;
    
    self.pageTitleView.cm_config = config;
    
}

- (void)style01_27 {
    

    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;

    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Underline;
    config.cm_underlineStretch = YES;
    config.cm_underlineWidth = 10;
    config.cm_gradientStyle = CMTitleColorGradientStyle_RGB;
    
    self.pageTitleView.cm_config = config;
    
}

- (void)style01_28 {
    

    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;

    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Underline;
    config.cm_underlineStretch = YES;
    config.cm_underlineWidth = 10;
    config.cm_gradientStyle = CMTitleColorGradientStyle_Fill;
    
    self.pageTitleView.cm_config = config;
    
}

- (void)style01_29 {
    

    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;

    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Underline;
    config.cm_underlineWidth = 10;
    config.cm_underlineStretch = YES;
    config.cm_gradientStyle = CMTitleColorGradientStyle_None;
    
    self.pageTitleView.cm_config = config;
    
}

- (void)style01_30 {
    

    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;

    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Underline;
    config.cm_underlineStretch = YES;
    config.cm_underlineWidthScale = 1.3;
    config.cm_gradientStyle = CMTitleColorGradientStyle_RGB;
    
    self.pageTitleView.cm_config = config;
    
}

- (void)style01_31 {
    

    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;

    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Underline;
    config.cm_underlineStretch = YES;
    config.cm_underlineWidthScale = 1.3;
    config.cm_gradientStyle = CMTitleColorGradientStyle_Fill;
    
    self.pageTitleView.cm_config = config;
    
}

- (void)style01_32 {
    

    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;

    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Underline;
    config.cm_underlineWidthScale = 1.3;
    config.cm_underlineStretch = YES;
    config.cm_gradientStyle = CMTitleColorGradientStyle_None;
    
    self.pageTitleView.cm_config = config;
    
}

- (void)style01_33 {
    

    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;

    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Cover;
    config.cm_gradientStyle = CMTitleColorGradientStyle_RGB;
    
    self.pageTitleView.cm_config = config;
    
}

- (void)style01_34 {
    

    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;

    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Cover;
    config.cm_gradientStyle = CMTitleColorGradientStyle_Fill;
    
    self.pageTitleView.cm_config = config;
    
}

- (void)style01_35 {
    

    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;

    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Cover;
    config.cm_gradientStyle = CMTitleColorGradientStyle_None;
    
    self.pageTitleView.cm_config = config;
    
}

- (void)style01_36 {
    

    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;

    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Cover | CMPageTitleSwitchMode_Delay;
    config.cm_gradientStyle = CMTitleColorGradientStyle_RGB;
    
    self.pageTitleView.cm_config = config;
    
    
}

- (void)style01_37 {
    

    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;

    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Cover | CMPageTitleSwitchMode_Delay;
    config.cm_gradientStyle = CMTitleColorGradientStyle_Fill;
    
    self.pageTitleView.cm_config = config;
    
    
    
}

- (void)style01_38 {
    

    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;

    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Cover | CMPageTitleSwitchMode_Delay;
    config.cm_gradientStyle = CMTitleColorGradientStyle_None;
    
    self.pageTitleView.cm_config = config;
    
}


- (void)style01_39 {
    

    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;

    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Cover;
    config.cm_coverWidth = 56;
    config.cm_gradientStyle = CMTitleColorGradientStyle_RGB;
    self.pageTitleView.cm_config = config;
    
}

- (void)style01_40 {
    

    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;

    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Cover;
    config.cm_coverWidth = 56;
    config.cm_gradientStyle = CMTitleColorGradientStyle_Fill;
    
    self.pageTitleView.cm_config = config;
    
}

- (void)style01_41 {
    

    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;

    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Cover;
    config.cm_coverWidth = 56;
    config.cm_gradientStyle = CMTitleColorGradientStyle_None;
    
    self.pageTitleView.cm_config = config;
    
}

- (void)style01_42 {
    

    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;

    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Cover | CMPageTitleSwitchMode_Delay;
    config.cm_coverWidth = 56;
    config.cm_gradientStyle = CMTitleColorGradientStyle_RGB;
    
    self.pageTitleView.cm_config = config;
    
    
}

- (void)style01_43 {
    

    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;

    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Cover | CMPageTitleSwitchMode_Delay;
    config.cm_coverWidth = 56;
    config.cm_gradientStyle = CMTitleColorGradientStyle_Fill;
    
    self.pageTitleView.cm_config = config;
    
    
    
}

- (void)style01_44 {
    

    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;

    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Cover | CMPageTitleSwitchMode_Delay;
    config.cm_coverWidth = 56;
    config.cm_gradientStyle = CMTitleColorGradientStyle_None;
    
    self.pageTitleView.cm_config = config;
    
}


- (void)style01_45 {
    

    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;

    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Scale | CMPageTitleSwitchMode_Underline;
    config.cm_gradientStyle = CMTitleColorGradientStyle_Fill;
    
    self.pageTitleView.cm_config = config;
    
}

- (void)style01_46 {
    

    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;

    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Scale | CMPageTitleSwitchMode_Underline | CMPageTitleSwitchMode_Delay;
    config.cm_gradientStyle = CMTitleColorGradientStyle_None;
    
    self.pageTitleView.cm_config = config;
    
}

- (void)style01_47 {
    

    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;

    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Scale | CMPageTitleSwitchMode_Underline;
    config.cm_gradientStyle = CMTitleColorGradientStyle_Fill;
    config.cm_underlineStretch = YES;
    
    self.pageTitleView.cm_config = config;
    
}

- (void)style01_48 {
    

    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;

    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Scale | CMPageTitleSwitchMode_Underline;
    config.cm_underlineStretch = YES;
    config.cm_underlineWidth = 10;
    config.cm_gradientStyle = CMTitleColorGradientStyle_Fill;
    
    self.pageTitleView.cm_config = config;
    
}

- (void)style01_49 {
    
    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;

    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Scale | CMPageTitleSwitchMode_Underline;
    config.cm_underlineStretch = YES;
    config.cm_underlineWidthScale = 0.6;
    config.cm_gradientStyle = CMTitleColorGradientStyle_Fill;
    
    self.pageTitleView.cm_config = config;
    
    
}

- (void)style01_50 {
    

    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;
    
    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Scale | CMPageTitleSwitchMode_Underline;
    config.cm_underlineStretch = YES;
    config.cm_gradientStyle = CMTitleColorGradientStyle_Fill;
    config.cm_scaleGradientContentMode = CMPageTitleScaleGradientContentMode_Bottom;
    config.cm_scale = 1.3;
    
    self.pageTitleView.cm_config = config;
    
}

- (void)style01_51 {
    

    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;

    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.lessChildControllers;
    config.cm_switchMode = CMPageTitleSwitchMode_Scale | CMPageTitleSwitchMode_Underline;
    config.cm_underlineStretch = YES;
    config.cm_gradientStyle = CMTitleColorGradientStyle_Fill;
    config.cm_contentMode = CMPageTitleContentMode_Left;
    config.cm_scaleGradientContentMode = CMPageTitleScaleGradientContentMode_Bottom;
    config.cm_scale = 1.3;
    
    
    self.pageTitleView.cm_config = config;
    
}

- (void)style02_00 {
    
    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;
    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_gradientStyle = CMTitleColorGradientStyle_RGB;
    config.cm_backgroundColor = [UIColor colorWithWhite:0 alpha:0.3];
    self.pageTitleView.cm_config = config;
}

- (void)style02_01 {
    
    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;
    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_gradientStyle = CMTitleColorGradientStyle_RGB;
    config.cm_backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"background_image"]];
    
    self.pageTitleView.cm_config = config;
}

- (void)style02_02 {
    
    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;
    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_gradientStyle = CMTitleColorGradientStyle_RGB;
    config.cm_titleTop = 20;
    config.cm_rightView = self.rightView;
    self.pageTitleView.cm_config = config;
}


- (void)style02_03 {
    

    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
        
    }];
    self.pageTitleView.delegate = self;

   CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;

    config.cm_switchMode = CMPageTitleSwitchMode_Scale | CMPageTitleSwitchMode_Underline;
    config.cm_underlineStretch = YES;
    config.cm_fullScreen = YES;
    config.cm_underlineWidthScale = 0.6;
    config.cm_gradientStyle = CMTitleColorGradientStyle_Fill;
    config.cm_scale = 1.3;
    config.cm_additionalMode = CMPageTitleAdditionalMode_Seperateline;
    config.cm_seperateLineHeight = 2;
    config.cm_seperaterLineColor = [UIColor.lightGrayColor colorWithAlphaComponent:0.7];
    config.cm_backgroundColor = [UIColor.whiteColor colorWithAlphaComponent:0.7];
    
    [self.childControllers setValue:@(config.cm_seperateLineHeight+config.cm_titleHeight) forKey:@"topInset"];

    
    self.pageTitleView.cm_config = config;
    
}


- (void)style02_04 {
    
    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
    }];
    self.pageTitleView.delegate = self;
    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.childControllers;
    config.cm_gradientStyle = CMTitleColorGradientStyle_Fill;
    config.cm_backgroundColor = UIColor.clearColor;
    config.cm_titleTop = 40;
    config.cm_fullScreen = YES;
    self.pageTitleView.cm_config = config;
    
}



- (void)style02_05 {
    
    [self.pageTitleView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.mas_equalTo(0);
        make.top.mas_equalTo(CM_NAVI_BAR_H);
        make.height.mas_equalTo(CM_SCREEN_H - CM_NAVI_BAR_H);
    }];
    self.pageTitleView.delegate = self;
    CMPageTitleConfig *config = [CMPageTitleConfig defaultConfig];
    config.cm_childControllers = self.twoControllers;
    config.cm_gradientStyle = CMTitleColorGradientStyle_Fill;
    config.cm_switchMode = CMPageTitleSwitchMode_Underline;
    config.cm_contentMode = CMPageTitleContentMode_SpaceAround;
    config.cm_underlineWidth = CM_SCREEN_W * 0.5;
    self.pageTitleView.cm_config = config;
    
}



- (void)cm_pageTitleViewSelectedWithIndex:(NSInteger)index Repeat:(BOOL)repeat {
    
    NSLog(@"第%ld个标题被选中;且%@是重复选中\n当前视图的高度:%lf",index,repeat?@"":@"不",self.pageTitleView.cm_config.cm_childControllers[index].view.cm_y);
    
    
}

- (void)cm_pageTitleViewClickWithIndex:(NSInteger)index Repeat:(BOOL)repeat {
    
    
    NSLog(@"第%ld个标题被点击;且%@是重复点击",index,repeat?@"":@"不");
    
}


- (void)cm_pageTitleViewScrollToIndex:(NSInteger)index {
    
    
    NSLog(@"当前滚动到第%ld个标题",index);
    
}



@end


================================================
FILE: CMPageTitleView/CMPageTitleView/Other/AppDelegate.h
================================================
//
//  AppDelegate.h
//  CMPageTitleView
//
//  Created by CrabMan on 2018/8/13.
//  Copyright © 2018年 CrabMan. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;


@end



================================================
FILE: CMPageTitleView/CMPageTitleView/Other/AppDelegate.m
================================================
//
//  AppDelegate.m
//  CMPageTitleView
//
//  Created by CrabMan on 2018/8/13.
//  Copyright © 2018年 CrabMan. All rights reserved.
//

#import "AppDelegate.h"
#import "CMMainTableController.h"
@interface AppDelegate ()

@end

@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    
    _window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
    
    UINavigationController *rootVC = [[UINavigationController alloc] initWithRootViewController:[CMMainTableController new]];
    rootVC.interactivePopGestureRecognizer.enabled = YES;
    _window.rootViewController = rootVC;

    [_window makeKeyAndVisible];
    return YES;
}


- (void)applicationWillResignActive:(UIApplication *)application {
    // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
    // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
}


- (void)applicationDidEnterBackground:(UIApplication *)application {
    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}


- (void)applicationWillEnterForeground:(UIApplication *)application {
    // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
}


- (void)applicationDidBecomeActive:(UIApplication *)application {
    // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
}


- (void)applicationWillTerminate:(UIApplication *)application {
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}


@end


================================================
FILE: CMPageTitleView/CMPageTitleView/Other/Assets.xcassets/AppIcon.appiconset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "iphone",
      "size" : "20x20",
      "scale" : "2x"
    },
    {
      "idiom" : "iphone",
      "size" : "20x20",
      "scale" : "3x"
    },
    {
      "idiom" : "iphone",
      "size" : "29x29",
      "scale" : "2x"
    },
    {
      "idiom" : "iphone",
      "size" : "29x29",
      "scale" : "3x"
    },
    {
      "idiom" : "iphone",
      "size" : "40x40",
      "scale" : "2x"
    },
    {
      "idiom" : "iphone",
      "size" : "40x40",
      "scale" : "3x"
    },
    {
      "idiom" : "iphone",
      "size" : "60x60",
      "scale" : "2x"
    },
    {
      "idiom" : "iphone",
      "size" : "60x60",
      "scale" : "3x"
    },
    {
      "idiom" : "ipad",
      "size" : "20x20",
      "scale" : "1x"
    },
    {
      "idiom" : "ipad",
      "size" : "20x20",
      "scale" : "2x"
    },
    {
      "idiom" : "ipad",
      "size" : "29x29",
      "scale" : "1x"
    },
    {
      "idiom" : "ipad",
      "size" : "29x29",
      "scale" : "2x"
    },
    {
      "idiom" : "ipad",
      "size" : "40x40",
      "scale" : "1x"
    },
    {
      "idiom" : "ipad",
      "size" : "40x40",
      "scale" : "2x"
    },
    {
      "idiom" : "ipad",
      "size" : "76x76",
      "scale" : "1x"
    },
    {
      "idiom" : "ipad",
      "size" : "76x76",
      "scale" : "2x"
    },
    {
      "idiom" : "ipad",
      "size" : "83.5x83.5",
      "scale" : "2x"
    },
    {
      "idiom" : "ios-marketing",
      "size" : "1024x1024",
      "scale" : "1x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: CMPageTitleView/CMPageTitleView/Other/Assets.xcassets/Contents.json
================================================
{
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: CMPageTitleView/CMPageTitleView/Other/Assets.xcassets/add.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "filename" : "添加.png",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: CMPageTitleView/CMPageTitleView/Other/Assets.xcassets/background_image.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "filename" : "background_image.jpg",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: CMPageTitleView/CMPageTitleView/Other/Base.lproj/LaunchScreen.storyboard
================================================
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
    <device id="retina6_1" orientation="portrait">
        <adaptation id="fullscreen"/>
    </device>
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14490.49"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <scenes>
        <!--View Controller-->
        <scene sceneID="EHf-IW-A2E">
            <objects>
                <viewController id="01J-lp-oVM" sceneMemberID="viewController">
                    <layoutGuides>
                        <viewControllerLayoutGuide type="top" id="cgc-24-o5G"/>
                        <viewControllerLayoutGuide type="bottom" id="BvC-lT-foE"/>
                    </layoutGuides>
                    <view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
                        <rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                        <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                    </view>
                </viewController>
                <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
            </objects>
            <point key="canvasLocation" x="53" y="375"/>
        </scene>
    </scenes>
</document>


================================================
FILE: CMPageTitleView/CMPageTitleView/Other/Base.lproj/Main.storyboard
================================================
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="BYZ-38-t0r">
    <device id="retina6_1" orientation="portrait">
        <adaptation id="fullscreen"/>
    </device>
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14490.49"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <scenes>
        <!--View Controller-->
        <scene sceneID="tne-QT-ifu">
            <objects>
                <viewController id="BYZ-38-t0r" customClass="ViewController" sceneMemberID="viewController">
                    <layoutGuides>
                        <viewControllerLayoutGuide type="top" id="vWM-KE-3TJ"/>
                        <viewControllerLayoutGuide type="bottom" id="FaY-Kh-9KK"/>
                    </layoutGuides>
                    <view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
                        <rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                        <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                    </view>
                </viewController>
                <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
            </objects>
        </scene>
    </scenes>
</document>


================================================
FILE: CMPageTitleView/CMPageTitleView/Other/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>CFBundleDevelopmentRegion</key>
	<string>$(DEVELOPMENT_LANGUAGE)</string>
	<key>CFBundleExecutable</key>
	<string>$(EXECUTABLE_NAME)</string>
	<key>CFBundleIdentifier</key>
	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
	<key>CFBundleInfoDictionaryVersion</key>
	<string>6.0</string>
	<key>CFBundleName</key>
	<string>$(PRODUCT_NAME)</string>
	<key>CFBundlePackageType</key>
	<string>APPL</string>
	<key>CFBundleShortVersionString</key>
	<string>1.0</string>
	<key>CFBundleVersion</key>
	<string>1</string>
	<key>LSRequiresIPhoneOS</key>
	<true/>
	<key>UILaunchStoryboardName</key>
	<string>LaunchScreen</string>
	<key>UIMainStoryboardFile</key>
	<string>Main</string>
	<key>UIRequiredDeviceCapabilities</key>
	<array>
		<string>armv7</string>
	</array>
	<key>UISupportedInterfaceOrientations</key>
	<array>
		<string>UIInterfaceOrientationPortrait</string>
		<string>UIInterfaceOrientationLandscapeLeft</string>
		<string>UIInterfaceOrientationLandscapeRight</string>
	</array>
	<key>UISupportedInterfaceOrientations~ipad</key>
	<array>
		<string>UIInterfaceOrientationPortrait</string>
		<string>UIInterfaceOrientationPortraitUpsideDown</string>
		<string>UIInterfaceOrientationLandscapeLeft</string>
		<string>UIInterfaceOrientationLandscapeRight</string>
	</array>
</dict>
</plist>


================================================
FILE: CMPageTitleView/CMPageTitleView/Other/main.m
================================================
//
//  main.m
//  CMPageTitleView
//
//  Created by CrabMan on 2018/8/13.
//  Copyright © 2018年 CrabMan. All rights reserved.
//

#import <UIKit/UIKit.h>
#import "AppDelegate.h"

int main(int argc, char * argv[]) {
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}


================================================
FILE: CMPageTitleView/CMPageTitleView.xcodeproj/project.pbxproj
================================================
// !$*UTF8*$!
{
	archiveVersion = 1;
	classes = {
	};
	objectVersion = 51;
	objects = {

/* Begin PBXBuildFile section */
		0401ED6B2488D66100A4129D /* CMChildTableController.m in Sources */ = {isa = PBXBuildFile; fileRef = 0401ED692488D66000A4129D /* CMChildTableController.m */; };
		20598ED47AE57CA3A7346B2E /* Pods_CMPageTitleViewTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A3D90BC7D0E023236111CFB8 /* Pods_CMPageTitleViewTests.framework */; };
		3D58563707075CC0ECF6EB1C /* Pods_CMPageTitleView.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8348F37DD152646043507B7D /* Pods_CMPageTitleView.framework */; };
		84EFD8C7E88418373356859D /* Pods_CMPageTitleViewUITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A2648515C1D6D8734A20D40 /* Pods_CMPageTitleViewUITests.framework */; };
		B51FABE0225DD15C004117BD /* CMMainTableController.m in Sources */ = {isa = PBXBuildFile; fileRef = B51FABDF225DD15C004117BD /* CMMainTableController.m */; };
		B51FABE3225DD2E7004117BD /* CMViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B51FABE2225DD2E7004117BD /* CMViewController.m */; };
		B53D96F7224883C50092BDE3 /* CMPageTitleConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = B53D96F6224883C50092BDE3 /* CMPageTitleConfig.m */; };
		B5B8ACF62249CA2D00ABF82B /* UIView+CMCommon.m in Sources */ = {isa = PBXBuildFile; fileRef = B5B8ACF52249CA2D00ABF82B /* UIView+CMCommon.m */; };
		B5EBC9C821215A72000403B8 /* CMPageTitleContentView.m in Sources */ = {isa = PBXBuildFile; fileRef = B5EBC9B921215A72000403B8 /* CMPageTitleContentView.m */; };
		B5EBC9C921215A72000403B8 /* CMPageContentView.m in Sources */ = {isa = PBXBuildFile; fileRef = B5EBC9BA21215A72000403B8 /* CMPageContentView.m */; };
		B5EBC9CA21215A72000403B8 /* CMPageTitleView.m in Sources */ = {isa = PBXBuildFile; fileRef = B5EBC9BB21215A72000403B8 /* CMPageTitleView.m */; };
		B5EBC9CB21215A72000403B8 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B5EBC9BE21215A72000403B8 /* Assets.xcassets */; };
		B5EBC9CD21215A72000403B8 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B5EBC9C021215A72000403B8 /* LaunchScreen.storyboard */; };
		B5EBC9CE21215A72000403B8 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B5EBC9C221215A72000403B8 /* Main.storyboard */; };
		B5EBC9CF21215A72000403B8 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = B5EBC9C421215A72000403B8 /* main.m */; };
		B5EBC9D021215A72000403B8 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = B5EBC9C521215A72000403B8 /* AppDelegate.m */; };
/* End PBXBuildFile section */

/* Begin PBXContainerItemProxy section */
		B5EBC99821215A31000403B8 /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = B5EBC97721215A2E000403B8 /* Project object */;
			proxyType = 1;
			remoteGlobalIDString = B5EBC97E21215A2F000403B8;
			remoteInfo = CMPageTitleView;
		};
		B5EBC9A321215A31000403B8 /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = B5EBC97721215A2E000403B8 /* Project object */;
			proxyType = 1;
			remoteGlobalIDString = B5EBC97E21215A2F000403B8;
			remoteInfo = CMPageTitleView;
		};
/* End PBXContainerItemProxy section */

/* Begin PBXFileReference section */
		0401ED692488D66000A4129D /* CMChildTableController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CMChildTableController.m; sourceTree = "<group>"; };
		0401ED6A2488D66100A4129D /* CMChildTableController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CMChildTableController.h; sourceTree = "<group>"; };
		1A2648515C1D6D8734A20D40 /* Pods_CMPageTitleViewUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_CMPageTitleViewUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
		6FB0CEAE97F306B2DE1A62A3 /* Pods-CMPageTitleViewUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CMPageTitleViewUITests.release.xcconfig"; path = "Target Support Files/Pods-CMPageTitleViewUITests/Pods-CMPageTitleViewUITests.release.xcconfig"; sourceTree = "<group>"; };
		789334BA070C5D2F074F49C9 /* Pods-CMPageTitleViewUITests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CMPageTitleViewUITests.debug.xcconfig"; path = "Target Support Files/Pods-CMPageTitleViewUITests/Pods-CMPageTitleViewUITests.debug.xcconfig"; sourceTree = "<group>"; };
		7A7BA8CFD14D0A58CCF66114 /* Pods-CMPageTitleViewTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CMPageTitleViewTests.release.xcconfig"; path = "Target Support Files/Pods-CMPageTitleViewTests/Pods-CMPageTitleViewTests.release.xcconfig"; sourceTree = "<group>"; };
		8348F37DD152646043507B7D /* Pods_CMPageTitleView.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_CMPageTitleView.framework; sourceTree = BUILT_PRODUCTS_DIR; };
		A3D90BC7D0E023236111CFB8 /* Pods_CMPageTitleViewTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_CMPageTitleViewTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
		AA21FEDE81DFC732D1A8BAFC /* Pods-CMPageTitleView.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CMPageTitleView.debug.xcconfig"; path = "Target Support Files/Pods-CMPageTitleView/Pods-CMPageTitleView.debug.xcconfig"; sourceTree = "<group>"; };
		B51FABDE225DD15C004117BD /* CMMainTableController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CMMainTableController.h; sourceTree = "<group>"; };
		B51FABDF225DD15C004117BD /* CMMainTableController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CMMainTableController.m; sourceTree = "<group>"; };
		B51FABE1225DD2E7004117BD /* CMViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CMViewController.h; sourceTree = "<group>"; };
		B51FABE2225DD2E7004117BD /* CMViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CMViewController.m; sourceTree = "<group>"; };
		B53D96F5224883C50092BDE3 /* CMPageTitleConfig.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CMPageTitleConfig.h; sourceTree = "<group>"; };
		B53D96F6224883C50092BDE3 /* CMPageTitleConfig.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CMPageTitleConfig.m; sourceTree = "<group>"; };
		B5B8ACF42249CA2D00ABF82B /* UIView+CMCommon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIView+CMCommon.h"; sourceTree = "<group>"; };
		B5B8ACF52249CA2D00ABF82B /* UIView+CMCommon.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIView+CMCommon.m"; sourceTree = "<group>"; };
		B5EBC97F21215A2F000403B8 /* CMPageTitleView.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = CMPageTitleView.app; sourceTree = BUILT_PRODUCTS_DIR; };
		B5EBC99721215A31000403B8 /* CMPageTitleViewTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CMPageTitleViewTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
		B5EBC9A221215A31000403B8 /* CMPageTitleViewUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CMPageTitleViewUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
		B5EBC9B621215A72000403B8 /* CMPageTitleContentView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CMPageTitleContentView.h; sourceTree = "<group>"; };
		B5EBC9B721215A72000403B8 /* CMPageContentView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CMPageContentView.h; sourceTree = "<group>"; };
		B5EBC9B821215A72000403B8 /* CMPageTitleView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CMPageTitleView.h; sourceTree = "<group>"; };
		B5EBC9B921215A72000403B8 /* CMPageTitleContentView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CMPageTitleContentView.m; sourceTree = "<group>"; };
		B5EBC9BA21215A72000403B8 /* CMPageContentView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CMPageContentView.m; sourceTree = "<group>"; };
		B5EBC9BB21215A72000403B8 /* CMPageTitleView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CMPageTitleView.m; sourceTree = "<group>"; };
		B5EBC9BD21215A72000403B8 /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
		B5EBC9BE21215A72000403B8 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
		B5EBC9C121215A72000403B8 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
		B5EBC9C321215A72000403B8 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
		B5EBC9C421215A72000403B8 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
		B5EBC9C521215A72000403B8 /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
		B5EBC9C621215A72000403B8 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
		B5EE93B922842CE60062F7C5 /* CMPageTitleViewMacro.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CMPageTitleViewMacro.h; sourceTree = "<group>"; };
		D3EFDB73791EB7362E8D3E81 /* Pods-CMPageTitleViewTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CMPageTitleViewTests.debug.xcconfig"; path = "Target Support Files/Pods-CMPageTitleViewTests/Pods-CMPageTitleViewTests.debug.xcconfig"; sourceTree = "<group>"; };
		E71FFC097CA2E6BE0DF86E8A /* Pods-CMPageTitleView.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CMPageTitleView.release.xcconfig"; path = "Target Support Files/Pods-CMPageTitleView/Pods-CMPageTitleView.release.xcconfig"; sourceTree = "<group>"; };
/* End PBXFileReference section */

/* Begin PBXFrameworksBuildPhase section */
		B5EBC97C21215A2F000403B8 /* Frameworks */ = {
			isa = PBXFrameworksBuildPhase;
			buildActionMask = 2147483647;
			files = (
				3D58563707075CC0ECF6EB1C /* Pods_CMPageTitleView.framework in Frameworks */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		B5EBC99421215A31000403B8 /* Frameworks */ = {
			isa = PBXFrameworksBuildPhase;
			buildActionMask = 2147483647;
			files = (
				20598ED47AE57CA3A7346B2E /* Pods_CMPageTitleViewTests.framework in Frameworks */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		B5EBC99F21215A31000403B8 /* Frameworks */ = {
			isa = PBXFrameworksBuildPhase;
			buildActionMask = 2147483647;
			files = (
				84EFD8C7E88418373356859D /* Pods_CMPageTitleViewUITests.framework in Frameworks */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
/* End PBXFrameworksBuildPhase section */

/* Begin PBXGroup section */
		96799725F871B0D79FB4BEF9 /* Frameworks */ = {
			isa = PBXGroup;
			children = (
				8348F37DD152646043507B7D /* Pods_CMPageTitleView.framework */,
				A3D90BC7D0E023236111CFB8 /* Pods_CMPageTitleViewTests.framework */,
				1A2648515C1D6D8734A20D40 /* Pods_CMPageTitleViewUITests.framework */,
			);
			name = Frameworks;
			sourceTree = "<group>";
		};
		A989CE2B24D8F6E64959D5F1 /* Pods */ = {
			isa = PBXGroup;
			children = (
				AA21FEDE81DFC732D1A8BAFC /* Pods-CMPageTitleView.debug.xcconfig */,
				E71FFC097CA2E6BE0DF86E8A /* Pods-CMPageTitleView.release.xcconfig */,
				D3EFDB73791EB7362E8D3E81 /* Pods-CMPageTitleViewTests.debug.xcconfig */,
				7A7BA8CFD14D0A58CCF66114 /* Pods-CMPageTitleViewTests.release.xcconfig */,
				789334BA070C5D2F074F49C9 /* Pods-CMPageTitleViewUITests.debug.xcconfig */,
				6FB0CEAE97F306B2DE1A62A3 /* Pods-CMPageTitleViewUITests.release.xcconfig */,
			);
			path = Pods;
			sourceTree = "<group>";
		};
		B51FABDD225DD0E1004117BD /* Demo */ = {
			isa = PBXGroup;
			children = (
				0401ED6A2488D66100A4129D /* CMChildTableController.h */,
				0401ED692488D66000A4129D /* CMChildTableController.m */,
				B51FABDE225DD15C004117BD /* CMMainTableController.h */,
				B51FABDF225DD15C004117BD /* CMMainTableController.m */,
				B51FABE1225DD2E7004117BD /* CMViewController.h */,
				B51FABE2225DD2E7004117BD /* CMViewController.m */,
			);
			path = Demo;
			sourceTree = "<group>";
		};
		B5EBC97621215A2E000403B8 = {
			isa = PBXGroup;
			children = (
				B5EBC98121215A2F000403B8 /* CMPageTitleView */,
				B5EBC98021215A2F000403B8 /* Products */,
				A989CE2B24D8F6E64959D5F1 /* Pods */,
				96799725F871B0D79FB4BEF9 /* Frameworks */,
			);
			sourceTree = "<group>";
		};
		B5EBC98021215A2F000403B8 /* Products */ = {
			isa = PBXGroup;
			children = (
				B5EBC97F21215A2F000403B8 /* CMPageTitleView.app */,
				B5EBC99721215A31000403B8 /* CMPageTitleViewTests.xctest */,
				B5EBC9A221215A31000403B8 /* CMPageTitleViewUITests.xctest */,
			);
			name = Products;
			sourceTree = "<group>";
		};
		B5EBC98121215A2F000403B8 /* CMPageTitleView */ = {
			isa = PBXGroup;
			children = (
				B5EBC9B421215A72000403B8 /* Class */,
				B51FABDD225DD0E1004117BD /* Demo */,
				B5EBC9BC21215A72000403B8 /* Other */,
			);
			path = CMPageTitleView;
			sourceTree = "<group>";
		};
		B5EBC9B421215A72000403B8 /* Class */ = {
			isa = PBXGroup;
			children = (
				B5EBC9B821215A72000403B8 /* CMPageTitleView.h */,
				B5EBC9BB21215A72000403B8 /* CMPageTitleView.m */,
				B5EE93B922842CE60062F7C5 /* CMPageTitleViewMacro.h */,
				B53D96F5224883C50092BDE3 /* CMPageTitleConfig.h */,
				B53D96F6224883C50092BDE3 /* CMPageTitleConfig.m */,
				B5EBC9B621215A72000403B8 /* CMPageTitleContentView.h */,
				B5EBC9B921215A72000403B8 /* CMPageTitleContentView.m */,
				B5EBC9B721215A72000403B8 /* CMPageContentView.h */,
				B5EBC9BA21215A72000403B8 /* CMPageContentView.m */,
				B5B8ACF42249CA2D00ABF82B /* UIView+CMCommon.h */,
				B5B8ACF52249CA2D00ABF82B /* UIView+CMCommon.m */,
			);
			path = Class;
			sourceTree = "<group>";
		};
		B5EBC9BC21215A72000403B8 /* Other */ = {
			isa = PBXGroup;
			children = (
				B5EBC9C621215A72000403B8 /* Info.plist */,
				B5EBC9BD21215A72000403B8 /* AppDelegate.h */,
				B5EBC9BE21215A72000403B8 /* Assets.xcassets */,
				B5EBC9C021215A72000403B8 /* LaunchScreen.storyboard */,
				B5EBC9C221215A72000403B8 /* Main.storyboard */,
				B5EBC9C421215A72000403B8 /* main.m */,
				B5EBC9C521215A72000403B8 /* AppDelegate.m */,
			);
			path = Other;
			sourceTree = "<group>";
		};
/* End PBXGroup section */

/* Begin PBXNativeTarget section */
		B5EBC97E21215A2F000403B8 /* CMPageTitleView */ = {
			isa = PBXNativeTarget;
			buildConfigurationList = B5EBC9AB21215A31000403B8 /* Build configuration list for PBXNativeTarget "CMPageTitleView" */;
			buildPhases = (
				EA8E859A87F38CEC3EBB190B /* [CP] Check Pods Manifest.lock */,
				B5EBC97B21215A2F000403B8 /* Sources */,
				B5EBC97C21215A2F000403B8 /* Frameworks */,
				B5EBC97D21215A2F000403B8 /* Resources */,
				13425E14AC1B19271209729D /* [CP] Embed Pods Frameworks */,
			);
			buildRules = (
			);
			dependencies = (
			);
			name = CMPageTitleView;
			productName = CMPageTitleView;
			productReference = B5EBC97F21215A2F000403B8 /* CMPageTitleView.app */;
			productType = "com.apple.product-type.application";
		};
		B5EBC99621215A31000403B8 /* CMPageTitleViewTests */ = {
			isa = PBXNativeTarget;
			buildConfigurationList = B5EBC9AE21215A31000403B8 /* Build configuration list for PBXNativeTarget "CMPageTitleViewTests" */;
			buildPhases = (
				BCBF7D2B3B6268AC9396A532 /* [CP] Check Pods Manifest.lock */,
				B5EBC99321215A31000403B8 /* Sources */,
				B5EBC99421215A31000403B8 /* Frameworks */,
				B5EBC99521215A31000403B8 /* Resources */,
			);
			buildRules = (
			);
			dependencies = (
				B5EBC99921215A31000403B8 /* PBXTargetDependency */,
			);
			name = CMPageTitleViewTests;
			productName = CMPageTitleViewTests;
			productReference = B5EBC99721215A31000403B8 /* CMPageTitleViewTests.xctest */;
			productType = "com.apple.product-type.bundle.unit-test";
		};
		B5EBC9A121215A31000403B8 /* CMPageTitleViewUITests */ = {
			isa = PBXNativeTarget;
			buildConfigurationList = B5EBC9B121215A31000403B8 /* Build configuration list for PBXNativeTarget "CMPageTitleViewUITests" */;
			buildPhases = (
				369B8B0CC80DC0B8EB0443E6 /* [CP] Check Pods Manifest.lock */,
				B5EBC99E21215A31000403B8 /* Sources */,
				B5EBC99F21215A31000403B8 /* Frameworks */,
				B5EBC9A021215A31000403B8 /* Resources */,
			);
			buildRules = (
			);
			dependencies = (
				B5EBC9A421215A31000403B8 /* PBXTargetDependency */,
			);
			name = CMPageTitleViewUITests;
			productName = CMPageTitleViewUITests;
			productReference = B5EBC9A221215A31000403B8 /* CMPageTitleViewUITests.xctest */;
			productType = "com.apple.product-type.bundle.ui-testing";
		};
/* End PBXNativeTarget section */

/* Begin PBXProject section */
		B5EBC97721215A2E000403B8 /* Project object */ = {
			isa = PBXProject;
			attributes = {
				LastUpgradeCheck = 1020;
				ORGANIZATIONNAME = CrabMan;
				TargetAttributes = {
					B5EBC97E21215A2F000403B8 = {
						CreatedOnToolsVersion = 9.3.1;
					};
					B5EBC99621215A31000403B8 = {
						CreatedOnToolsVersion = 9.3.1;
						TestTargetID = B5EBC97E21215A2F000403B8;
					};
					B5EBC9A121215A31000403B8 = {
						CreatedOnToolsVersion = 9.3.1;
						TestTargetID = B5EBC97E21215A2F000403B8;
					};
				};
			};
			buildConfigurationList = B5EBC97A21215A2E000403B8 /* Build configuration list for PBXProject "CMPageTitleView" */;
			compatibilityVersion = "Xcode 9.3";
			developmentRegion = en;
			hasScannedForEncodings = 0;
			knownRegions = (
				en,
				Base,
			);
			mainGroup = B5EBC97621215A2E000403B8;
			productRefGroup = B5EBC98021215A2F000403B8 /* Products */;
			projectDirPath = "";
			projectRoot = "";
			targets = (
				B5EBC97E21215A2F000403B8 /* CMPageTitleView */,
				B5EBC99621215A31000403B8 /* CMPageTitleViewTests */,
				B5EBC9A121215A31000403B8 /* CMPageTitleViewUITests */,
			);
		};
/* End PBXProject section */

/* Begin PBXResourcesBuildPhase section */
		B5EBC97D21215A2F000403B8 /* Resources */ = {
			isa = PBXResourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
				B5EBC9CE21215A72000403B8 /* Main.storyboard in Resources */,
				B5EBC9CB21215A72000403B8 /* Assets.xcassets in Resources */,
				B5EBC9CD21215A72000403B8 /* LaunchScreen.storyboard in Resources */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		B5EBC99521215A31000403B8 /* Resources */ = {
			isa = PBXResourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		B5EBC9A021215A31000403B8 /* Resources */ = {
			isa = PBXResourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
/* End PBXResourcesBuildPhase section */

/* Begin PBXShellScriptBuildPhase section */
		13425E14AC1B19271209729D /* [CP] Embed Pods Frameworks */ = {
			isa = PBXShellScriptBuildPhase;
			buildActionMask = 2147483647;
			files = (
			);
			inputFileListPaths = (
				"${PODS_ROOT}/Target Support Files/Pods-CMPageTitleView/Pods-CMPageTitleView-frameworks-${CONFIGURATION}-input-files.xcfilelist",
			);
			name = "[CP] Embed Pods Frameworks";
			outputFileListPaths = (
				"${PODS_ROOT}/Target Support Files/Pods-CMPageTitleView/Pods-CMPageTitleView-frameworks-${CONFIGURATION}-output-files.xcfilelist",
			);
			runOnlyForDeploymentPostprocessing = 0;
			shellPath = /bin/sh;
			shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-CMPageTitleView/Pods-CMPageTitleView-frameworks.sh\"\n";
			showEnvVarsInLog = 0;
		};
		369B8B0CC80DC0B8EB0443E6 /* [CP] Check Pods Manifest.lock */ = {
			isa = PBXShellScriptBuildPhase;
			buildActionMask = 2147483647;
			files = (
			);
			inputFileListPaths = (
			);
			inputPaths = (
				"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
				"${PODS_ROOT}/Manifest.lock",
			);
			name = "[CP] Check Pods Manifest.lock";
			outputFileListPaths = (
			);
			outputPaths = (
				"$(DERIVED_FILE_DIR)/Pods-CMPageTitleViewUITests-checkManifestLockResult.txt",
			);
			runOnlyForDeploymentPostprocessing = 0;
			shellPath = /bin/sh;
			shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n    # print error to STDERR\n    echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n    exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
			showEnvVarsInLog = 0;
		};
		BCBF7D2B3B6268AC9396A532 /* [CP] Check Pods Manifest.lock */ = {
			isa = PBXShellScriptBuildPhase;
			buildActionMask = 2147483647;
			files = (
			);
			inputFileListPaths = (
			);
			inputPaths = (
				"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
				"${PODS_ROOT}/Manifest.lock",
			);
			name = "[CP] Check Pods Manifest.lock";
			outputFileListPaths = (
			);
			outputPaths = (
				"$(DERIVED_FILE_DIR)/Pods-CMPageTitleViewTests-checkManifestLockResult.txt",
			);
			runOnlyForDeploymentPostprocessing = 0;
			shellPath = /bin/sh;
			shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n    # print error to STDERR\n    echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n    exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
			showEnvVarsInLog = 0;
		};
		EA8E859A87F38CEC3EBB190B /* [CP] Check Pods Manifest.lock */ = {
			isa = PBXShellScriptBuildPhase;
			buildActionMask = 2147483647;
			files = (
			);
			inputFileListPaths = (
			);
			inputPaths = (
				"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
				"${PODS_ROOT}/Manifest.lock",
			);
			name = "[CP] Check Pods Manifest.lock";
			outputFileListPaths = (
			);
			outputPaths = (
				"$(DERIVED_FILE_DIR)/Pods-CMPageTitleView-checkManifestLockResult.txt",
			);
			runOnlyForDeploymentPostprocessing = 0;
			shellPath = /bin/sh;
			shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n    # print error to STDERR\n    echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n    exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
			showEnvVarsInLog = 0;
		};
/* End PBXShellScriptBuildPhase section */

/* Begin PBXSourcesBuildPhase section */
		B5EBC97B21215A2F000403B8 /* Sources */ = {
			isa = PBXSourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
				B5B8ACF62249CA2D00ABF82B /* UIView+CMCommon.m in Sources */,
				B53D96F7224883C50092BDE3 /* CMPageTitleConfig.m in Sources */,
				B5EBC9CF21215A72000403B8 /* main.m in Sources */,
				B5EBC9C821215A72000403B8 /* CMPageTitleContentView.m in Sources */,
				B5EBC9D021215A72000403B8 /* AppDelegate.m in Sources */,
				0401ED6B2488D66100A4129D /* CMChildTableController.m in Sources */,
				B51FABE3225DD2E7004117BD /* CMViewController.m in Sources */,
				B51FABE0225DD15C004117BD /* CMMainTableController.m in Sources */,
				B5EBC9CA21215A72000403B8 /* CMPageTitleView.m in Sources */,
				B5EBC9C921215A72000403B8 /* CMPageContentView.m in Sources */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		B5EBC99321215A31000403B8 /* Sources */ = {
			isa = PBXSourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
		B5EBC99E21215A31000403B8 /* Sources */ = {
			isa = PBXSourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
/* End PBXSourcesBuildPhase section */

/* Begin PBXTargetDependency section */
		B5EBC99921215A31000403B8 /* PBXTargetDependency */ = {
			isa = PBXTargetDependency;
			target = B5EBC97E21215A2F000403B8 /* CMPageTitleView */;
			targetProxy = B5EBC99821215A31000403B8 /* PBXContainerItemProxy */;
		};
		B5EBC9A421215A31000403B8 /* PBXTargetDependency */ = {
			isa = PBXTargetDependency;
			target = B5EBC97E21215A2F000403B8 /* CMPageTitleView */;
			targetProxy = B5EBC9A321215A31000403B8 /* PBXContainerItemProxy */;
		};
/* End PBXTargetDependency section */

/* Begin PBXVariantGroup section */
		B5EBC9C021215A72000403B8 /* LaunchScreen.storyboard */ = {
			isa = PBXVariantGroup;
			children = (
				B5EBC9C121215A72000403B8 /* Base */,
			);
			name = LaunchScreen.storyboard;
			sourceTree = "<group>";
		};
		B5EBC9C221215A72000403B8 /* Main.storyboard */ = {
			isa = PBXVariantGroup;
			children = (
				B5EBC9C321215A72000403B8 /* Base */,
			);
			name = Main.storyboard;
			sourceTree = "<group>";
		};
/* End PBXVariantGroup section */

/* Begin XCBuildConfiguration section */
		B5EBC9A921215A31000403B8 /* Debug */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				ALWAYS_SEARCH_USER_PATHS = NO;
				CLANG_ANALYZER_NONNULL = YES;
				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
				CLANG_CXX_LIBRARY = "libc++";
				CLANG_ENABLE_MODULES = YES;
				CLANG_ENABLE_OBJC_ARC = YES;
				CLANG_ENABLE_OBJC_WEAK = YES;
				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
				CLANG_WARN_BOOL_CONVERSION = YES;
				CLANG_WARN_COMMA = YES;
				CLANG_WARN_CONSTANT_CONVERSION = YES;
				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
				CLANG_WARN_EMPTY_BODY = YES;
				CLANG_WARN_ENUM_CONVERSION = YES;
				CLANG_WARN_INFINITE_RECURSION = YES;
				CLANG_WARN_INT_CONVERSION = YES;
				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
				CLANG_WARN_STRICT_PROTOTYPES = YES;
				CLANG_WARN_SUSPICIOUS_MOVE = YES;
				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
				CLANG_WARN_UNREACHABLE_CODE = YES;
				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
				CODE_SIGN_IDENTITY = "iPhone Developer";
				COPY_PHASE_STRIP = NO;
				DEBUG_INFORMATION_FORMAT = dwarf;
				ENABLE_STRICT_OBJC_MSGSEND = YES;
				ENABLE_TESTABILITY = YES;
				GCC_C_LANGUAGE_STANDARD = gnu11;
				GCC_DYNAMIC_NO_PIC = NO;
				GCC_NO_COMMON_BLOCKS = YES;
				GCC_OPTIMIZATION_LEVEL = 0;
				GCC_PREPROCESSOR_DEFINITIONS = (
					"DEBUG=1",
					"$(inherited)",
				);
				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
				GCC_WARN_UNDECLARED_SELECTOR = YES;
				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
				GCC_WARN_UNUSED_FUNCTION = YES;
				GCC_WARN_UNUSED_VARIABLE = YES;
				IPHONEOS_DEPLOYMENT_TARGET = 11.3;
				MTL_ENABLE_DEBUG_INFO = YES;
				ONLY_ACTIVE_ARCH = YES;
				SDKROOT = iphoneos;
			};
			name = Debug;
		};
		B5EBC9AA21215A31000403B8 /* Release */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				ALWAYS_SEARCH_USER_PATHS = NO;
				CLANG_ANALYZER_NONNULL = YES;
				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
				CLANG_CXX_LIBRARY = "libc++";
				CLANG_ENABLE_MODULES = YES;
				CLANG_ENABLE_OBJC_ARC = YES;
				CLANG_ENABLE_OBJC_WEAK = YES;
				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
				CLANG_WARN_BOOL_CONVERSION = YES;
				CLANG_WARN_COMMA = YES;
				CLANG_WARN_CONSTANT_CONVERSION = YES;
				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
				CLANG_WARN_EMPTY_BODY = YES;
				CLANG_WARN_ENUM_CONVERSION = YES;
				CLANG_WARN_INFINITE_RECURSION = YES;
				CLANG_WARN_INT_CONVERSION = YES;
				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
				CLANG_WARN_STRICT_PROTOTYPES = YES;
				CLANG_WARN_SUSPICIOUS_MOVE = YES;
				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
				CLANG_WARN_UNREACHABLE_CODE = YES;
				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
				CODE_SIGN_IDENTITY = "iPhone Developer";
				COPY_PHASE_STRIP = NO;
				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
				ENABLE_NS_ASSERTIONS = NO;
				ENABLE_STRICT_OBJC_MSGSEND = YES;
				GCC_C_LANGUAGE_STANDARD = gnu11;
				GCC_NO_COMMON_BLOCKS = YES;
				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
				GCC_WARN_UNDECLARED_SELECTOR = YES;
				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
				GCC_WARN_UNUSED_FUNCTION = YES;
				GCC_WARN_UNUSED_VARIABLE = YES;
				IPHONEOS_DEPLOYMENT_TARGET = 11.3;
				MTL_ENABLE_DEBUG_INFO = NO;
				SDKROOT = iphoneos;
				VALIDATE_PRODUCT = YES;
			};
			name = Release;
		};
		B5EBC9AC21215A31000403B8 /* Debug */ = {
			isa = XCBuildConfiguration;
			baseConfigurationReference = AA21FEDE81DFC732D1A8BAFC /* Pods-CMPageTitleView.debug.xcconfig */;
			buildSettings = {
				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
				CODE_SIGN_STYLE = Automatic;
				DEVELOPMENT_TEAM = HBW48U6989;
				GCC_PREFIX_HEADER = "";
				INFOPLIST_FILE = "$(SRCROOT)/CMPageTitleView/Other/Info.plist";
				IPHONEOS_DEPLOYMENT_TARGET = 9.0;
				LD_RUNPATH_SEARCH_PATHS = (
					"$(inherited)",
					"@executable_path/Frameworks",
				);
				OTHER_LDFLAGS = (
					"$(inherited)",
					"-all_load",
					"-Objc",
				);
				PRODUCT_BUNDLE_IDENTIFIER = com.CMPageTitleView.crabman;
				PRODUCT_NAME = "$(TARGET_NAME)";
				TARGETED_DEVICE_FAMILY = "1,2";
				USER_HEADER_SEARCH_PATHS = "$(PODS_ROOT)/**";
			};
			name = Debug;
		};
		B5EBC9AD21215A31000403B8 /* Release */ = {
			isa = XCBuildConfiguration;
			baseConfigurationReference = E71FFC097CA2E6BE0DF86E8A /* Pods-CMPageTitleView.release.xcconfig */;
			buildSettings = {
				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
				CODE_SIGN_STYLE = Automatic;
				DEVELOPMENT_TEAM = HBW48U6989;
				GCC_PREFIX_HEADER = "";
				INFOPLIST_FILE = "$(SRCROOT)/CMPageTitleView/Other/Info.plist";
				IPHONEOS_DEPLOYMENT_TARGET = 9.0;
				LD_RUNPATH_SEARCH_PATHS = (
					"$(inherited)",
					"@executable_path/Frameworks",
				);
				OTHER_LDFLAGS = (
					"$(inherited)",
					"-all_load",
					"-Objc",
				);
				PRODUCT_BUNDLE_IDENTIFIER = com.CMPageTitleView.crabman;
				PRODUCT_NAME = "$(TARGET_NAME)";
				TARGETED_DEVICE_FAMILY = "1,2";
				USER_HEADER_SEARCH_PATHS = "$(PODS_ROOT)/**";
			};
			name = Release;
		};
		B5EBC9AF21215A31000403B8 /* Debug */ = {
			isa = XCBuildConfiguration;
			baseConfigurationReference = D3EFDB73791EB7362E8D3E81 /* Pods-CMPageTitleViewTests.debug.xcconfig */;
			buildSettings = {
				BUNDLE_LOADER = "$(TEST_HOST)";
				CODE_SIGN_STYLE = Automatic;
				INFOPLIST_FILE = CMPageTitleViewTests/Info.plist;
				LD_RUNPATH_SEARCH_PATHS = (
					"$(inherited)",
					"@executable_path/Frameworks",
					"@loader_path/Frameworks",
				);
				PRODUCT_BUNDLE_IDENTIFIER = CrabMan.CMPageTitleViewTests;
				PRODUCT_NAME = "$(TARGET_NAME)";
				TARGETED_DEVICE_FAMILY = "1,2";
				TEST_HOST = "$(BUILT_PRODUCTS_DIR)/CMPageTitleView.app/CMPageTitleView";
			};
			name = Debug;
		};
		B5EBC9B021215A31000403B8 /* Release */ = {
			isa = XCBuildConfiguration;
			baseConfigurationReference = 7A7BA8CFD14D0A58CCF66114 /* Pods-CMPageTitleViewTests.release.xcconfig */;
			buildSettings = {
				BUNDLE_LOADER = "$(TEST_HOST)";
				CODE_SIGN_STYLE = Automatic;
				INFOPLIST_FILE = CMPageTitleViewTests/Info.plist;
				LD_RUNPATH_SEARCH_PATHS = (
					"$(inherited)",
					"@executable_path/Frameworks",
					"@loader_path/Frameworks",
				);
				PRODUCT_BUNDLE_IDENTIFIER = CrabMan.CMPageTitleViewTests;
				PRODUCT_NAME = "$(TARGET_NAME)";
				TARGETED_DEVICE_FAMILY = "1,2";
				TEST_HOST = "$(BUILT_PRODUCTS_DIR)/CMPageTitleView.app/CMPageTitleView";
			};
			name = Release;
		};
		B5EBC9B221215A31000403B8 /* Debug */ = {
			isa = XCBuildConfiguration;
			baseConfigurationReference = 789334BA070C5D2F074F49C9 /* Pods-CMPageTitleViewUITests.debug.xcconfig */;
			buildSettings = {
				CODE_SIGN_STYLE = Automatic;
				INFOPLIST_FILE = CMPageTitleViewUITests/Info.plist;
				LD_RUNPATH_SEARCH_PATHS = (
					"$(inherited)",
					"@executable_path/Frameworks",
					"@loader_path/Frameworks",
				);
				PRODUCT_BUNDLE_IDENTIFIER = CrabMan.CMPageTitleViewUITests;
				PRODUCT_NAME = "$(TARGET_NAME)";
				TARGETED_DEVICE_FAMILY = "1,2";
				TEST_TARGET_NAME = CMPageTitleView;
			};
			name = Debug;
		};
		B5EBC9B321215A31000403B8 /* Release */ = {
			isa = XCBuildConfiguration;
			baseConfigurationReference = 6FB0CEAE97F306B2DE1A62A3 /* Pods-CMPageTitleViewUITests.release.xcconfig */;
			buildSettings = {
				CODE_SIGN_STYLE = Automatic;
				INFOPLIST_FILE = CMPageTitleViewUITests/Info.plist;
				LD_RUNPATH_SEARCH_PATHS = (
					"$(inherited)",
					"@executable_path/Frameworks",
					"@loader_path/Frameworks",
				);
				PRODUCT_BUNDLE_IDENTIFIER = CrabMan.CMPageTitleViewUITests;
				PRODUCT_NAME = "$(TARGET_NAME)";
				TARGETED_DEVICE_FAMILY = "1,2";
				TEST_TARGET_NAME = CMPageTitleView;
			};
			name = Release;
		};
/* End XCBuildConfiguration section */

/* Begin XCConfigurationList section */
		B5EBC97A21215A2E000403B8 /* Build configuration list for PBXProject "CMPageTitleView" */ = {
			isa = XCConfigurationList;
			buildConfigurations = (
				B5EBC9A921215A31000403B8 /* Debug */,
				B5EBC9AA21215A31000403B8 /* Release */,
			);
			defaultConfigurationIsVisible = 0;
			defaultConfigurationName = Release;
		};
		B5EBC9AB21215A31000403B8 /* Build configuration list for PBXNativeTarget "CMPageTitleView" */ = {
			isa = XCConfigurationList;
			buildConfigurations = (
				B5EBC9AC21215A31000403B8 /* Debug */,
				B5EBC9AD21215A31000403B8 /* Release */,
			);
			defaultConfigurationIsVisible = 0;
			defaultConfigurationName = Release;
		};
		B5EBC9AE21215A31000403B8 /* Build configuration list for PBXNativeTarget "CMPageTitleViewTests" */ = {
			isa = XCConfigurationList;
			buildConfigurations = (
				B5EBC9AF21215A31000403B8 /* Debug */,
				B5EBC9B021215A31000403B8 /* Release */,
			);
			defaultConfigurationIsVisible = 0;
			defaultConfigurationName = Release;
		};
		B5EBC9B121215A31000403B8 /* Build configuration list for PBXNativeTarget "CMPageTitleViewUITests" */ = {
			isa = XCConfigurationList;
			buildConfigurations = (
				B5EBC9B221215A31000403B8 /* Debug */,
				B5EBC9B321215A31000403B8 /* Release */,
			);
			defaultConfigurationIsVisible = 0;
			defaultConfigurationName = Release;
		};
/* End XCConfigurationList section */
	};
	rootObject = B5EBC97721215A2E000403B8 /* Project object */;
}


================================================
FILE: CMPageTitleView/CMPageTitleView.xcodeproj/project.xcworkspace/contents.xcworkspacedata
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
   version = "1.0">
   <FileRef
      location = "self:CMPageTitleView.xcodeproj">
   </FileRef>
</Workspace>


================================================
FILE: CMPageTitleView/CMPageTitleView.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>IDEDidComputeMac32BitWarning</key>
	<true/>
</dict>
</plist>


================================================
FILE: CMPageTitleView/CMPageTitleView.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>BuildSystemType</key>
	<string>Original</string>
</dict>
</plist>


================================================
FILE: CMPageTitleView/CMPageTitleView.xcworkspace/contents.xcworkspacedata
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
   version = "1.0">
   <FileRef
      location = "group:CMPageTitleView.xcodeproj">
   </FileRef>
   <FileRef
      location = "group:Pods/Pods.xcodeproj">
   </FileRef>
</Workspace>


================================================
FILE: CMPageTitleView/CMPageTitleView.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>IDEDidComputeMac32BitWarning</key>
	<true/>
</dict>
</plist>


================================================
FILE: CMPageTitleView/CMPageTitleView.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>BuildSystemType</key>
	<string>Original</string>
</dict>
</plist>


================================================
FILE: CMPageTitleView/Podfile
================================================
# Uncomment the next line to define a global platform for your project
 platform :ios, '9.0'

target 'CMPageTitleView' do
  # Uncomment the next line if you're using Swift or would like to use dynamic frameworks
   use_frameworks!

  # Pods for CMPageTitleView

  pod 'Masonry'
  pod 'MJRefresh'
  
target 'CMPageTitleViewTests' do
    inherit! :search_paths
    # Pods for testing

 end

  target 'CMPageTitleViewUITests' do
    inherit! :search_paths
    # Pods for testing
  end

end


================================================
FILE: CMPageTitleView/Pods/MJRefresh/LICENSE
================================================
Copyright (c) 2013-2015 MJRefresh (https://github.com/CoderMJLee/MJRefresh)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.


================================================
FILE: CMPageTitleView/Pods/MJRefresh/MJRefresh/Base/MJRefreshAutoFooter.h
================================================
//
//  MJRefreshAutoFooter.h
//  MJRefreshExample
//
//  Created by MJ Lee on 15/4/24.
//  Copyright (c) 2015年 小码哥. All rights reserved.
//

#import "MJRefreshFooter.h"

NS_ASSUME_NONNULL_BEGIN

@interface MJRefreshAutoFooter : MJRefreshFooter
/** 是否自动刷新(默认为YES) */
@property (assign, nonatomic, getter=isAutomaticallyRefresh) BOOL automaticallyRefresh;

/** 当底部控件出现多少时就自动刷新(默认为1.0,也就是底部控件完全出现时,才会自动刷新) */
@property (assign, nonatomic) CGFloat appearencePercentTriggerAutoRefresh MJRefreshDeprecated("请使用triggerAutomaticallyRefreshPercent属性");

/** 当底部控件出现多少时就自动刷新(默认为1.0,也就是底部控件完全出现时,才会自动刷新) */
@property (assign, nonatomic) CGFloat triggerAutomaticallyRefreshPercent;

/** 自动触发次数, 默认为 1, 仅在拖拽 ScrollView 时才生效,
 
 如果为 -1, 则为无限触发
 */
@property (nonatomic) NSInteger autoTriggerTimes;
@end

NS_ASSUME_NONNULL_END


================================================
FILE: CMPageTitleView/Pods/MJRefresh/MJRefresh/Base/MJRefreshAutoFooter.m
================================================
//
//  MJRefreshAutoFooter.m
//  MJRefreshExample
//
//  Created by MJ Lee on 15/4/24.
//  Copyright (c) 2015年 小码哥. All rights reserved.
//

#import "MJRefreshAutoFooter.h"

@interface MJRefreshAutoFooter()
/** 一个新的拖拽 */
@property (nonatomic) BOOL triggerByDrag;
@property (nonatomic) NSInteger leftTriggerTimes;
@end

@implementation MJRefreshAutoFooter

#pragma mark - 初始化
- (void)willMoveToSuperview:(UIView *)newSuperview
{
    [super willMoveToSuperview:newSuperview];
    
    if (newSuperview) { // 新的父控件
        if (self.hidden == NO) {
            self.scrollView.mj_insetB += self.mj_h;
        }
        
        // 设置位置
        self.mj_y = _scrollView.mj_contentH;
    } else { // 被移除了
        if (self.hidden == NO) {
            self.scrollView.mj_insetB -= self.mj_h;
        }
    }
}

#pragma mark - 过期方法
- (void)setAppearencePercentTriggerAutoRefresh:(CGFloat)appearencePercentTriggerAutoRefresh
{
    self.triggerAutomaticallyRefreshPercent = appearencePercentTriggerAutoRefresh;
}

- (CGFloat)appearencePercentTriggerAutoRefresh
{
    return self.triggerAutomaticallyRefreshPercent;
}

#pragma mark - 实现父类的方法
- (void)prepare
{
    [super prepare];
    
    // 默认底部控件100%出现时才会自动刷新
    self.triggerAutomaticallyRefreshPercent = 1.0;
    
    // 设置为默认状态
    self.automaticallyRefresh = YES;
    
    self.autoTriggerTimes = 1;
}

- (void)scrollViewContentSizeDidChange:(NSDictionary *)change
{
    [super scrollViewContentSizeDidChange:change];
    
    // 设置位置
    self.mj_y = self.scrollView.mj_contentH + self.ignoredScrollViewContentInsetBottom;
}

- (void)scrollViewContentOffsetDidChange:(NSDictionary *)change
{
    [super scrollViewContentOffsetDidChange:change];
    
    if (self.state != MJRefreshStateIdle || !self.automaticallyRefresh || self.mj_y == 0) return;
    
    if (_scrollView.mj_insetT + _scrollView.mj_contentH > _scrollView.mj_h) { // 内容超过一个屏幕
        // 这里的_scrollView.mj_contentH替换掉self.mj_y更为合理
        if (_scrollView.mj_offsetY >= _scrollView.mj_contentH - _scrollView.mj_h + self.mj_h * self.triggerAutomaticallyRefreshPercent + _scrollView.mj_insetB - self.mj_h) {
            // 防止手松开时连续调用
            CGPoint old = [change[@"old"] CGPointValue];
            CGPoint new = [change[@"new"] CGPointValue];
            if (new.y <= old.y) return;
            
            if (_scrollView.isDragging) {
                self.triggerByDrag = YES;
            }
            // 当底部刷新控件完全出现时,才刷新
            [self beginRefreshing];
        }
    }
}

- (void)scrollViewPanStateDidChange:(NSDictionary *)change
{
    [super scrollViewPanStateDidChange:change];
    
    if (self.state != MJRefreshStateIdle) return;
    
    UIGestureRecognizerState panState = _scrollView.panGestureRecognizer.state;
    
    switch (panState) {
        // 手松开
        case UIGestureRecognizerStateEnded: {
            if (_scrollView.mj_insetT + _scrollView.mj_contentH <= _scrollView.mj_h) {  // 不够一个屏幕
                if (_scrollView.mj_offsetY >= - _scrollView.mj_insetT) { // 向上拽
                    self.triggerByDrag = YES;
                    [self beginRefreshing];
                }
            } else { // 超出一个屏幕
                if (_scrollView.mj_offsetY >= _scrollView.mj_contentH + _scrollView.mj_insetB - _scrollView.mj_h) {
                    self.triggerByDrag = YES;
                    [self beginRefreshing];
                }
            }
        }
            break;
            
        case UIGestureRecognizerStateBegan: {
            [self resetTriggerTimes];
        }
            break;
            
        default:
            break;
    }
}

- (BOOL)unlimitedTrigger {
    return self.leftTriggerTimes == -1;
}

- (void)beginRefreshing
{
    if (self.triggerByDrag && self.leftTriggerTimes <= 0 && !self.unlimitedTrigger) {
        return;
    }
    
    [super beginRefreshing];
}

- (void)setState:(MJRefreshState)state
{
    MJRefreshCheckState
    
    if (state == MJRefreshStateRefreshing) {
        [self executeRefreshingCallback];
    } else if (state == MJRefreshStateNoMoreData || state == MJRefreshStateIdle) {
        if (self.triggerByDrag) {
            if (!self.unlimitedTrigger) {
                self.leftTriggerTimes -= 1;
            }
            self.triggerByDrag = NO;
        }
        
        if (MJRefreshStateRefreshing == oldState) {
            if (self.scrollView.pagingEnabled) {
                CGPoint offset = self.scrollView.contentOffset;
                offset.y -= self.scrollView.mj_insetB;
                [UIView animateWithDuration:MJRefreshSlowAnimationDuration animations:^{
                    self.scrollView.contentOffset = offset;
                    
                    if (self.endRefreshingAnimationBeginAction) {
                        self.endRefreshingAnimationBeginAction();
                    }
                } completion:^(BOOL finished) {
                    if (self.endRefreshingCompletionBlock) {
                        self.endRefreshingCompletionBlock();
                    }
                }];
                return;
            }
            
            if (self.endRefreshingCompletionBlock) {
                self.endRefreshingCompletionBlock();
            }
        }
    }
}

- (void)resetTriggerTimes {
    self.leftTriggerTimes = self.autoTriggerTimes;
}

- (void)setHidden:(BOOL)hidden
{
    BOOL lastHidden = self.isHidden;
    
    [super setHidden:hidden];
    
    if (!lastHidden && hidden) {
        self.state = MJRefreshStateIdle;
        
        self.scrollView.mj_insetB -= self.mj_h;
    } else if (lastHidden && !hidden) {
        self.scrollView.mj_insetB += self.mj_h;
        
        // 设置位置
        self.mj_y = _scrollView.mj_contentH;
    }
}

- (void)setAutoTriggerTimes:(NSInteger)autoTriggerTimes {
    _autoTriggerTimes = autoTriggerTimes;
    self.leftTriggerTimes = autoTriggerTimes;
}
@end


================================================
FILE: CMPageTitleView/Pods/MJRefresh/MJRefresh/Base/MJRefreshBackFooter.h
================================================
//
//  MJRefreshBackFooter.h
//  MJRefreshExample
//
//  Created by MJ Lee on 15/4/24.
//  Copyright (c) 2015年 小码哥. All rights reserved.
//

#import "MJRefreshFooter.h"

NS_ASSUME_NONNULL_BEGIN

@interface MJRefreshBackFooter : MJRefreshFooter

@end

NS_ASSUME_NONNULL_END


================================================
FILE: CMPageTitleView/Pods/MJRefresh/MJRefresh/Base/MJRefreshBackFooter.m
================================================
//
//  MJRefreshBackFooter.m
//  MJRefreshExample
//
//  Created by MJ Lee on 15/4/24.
//  Copyright (c) 2015年 小码哥. All rights reserved.
//

#import "MJRefreshBackFooter.h"

@interface MJRefreshBackFooter()
@property (assign, nonatomic) NSInteger lastRefreshCount;
@property (assign, nonatomic) CGFloat lastBottomDelta;
@end

@implementation MJRefreshBackFooter

#pragma mark - 初始化
- (void)willMoveToSuperview:(UIView *)newSuperview
{
    [super willMoveToSuperview:newSuperview];
    
    [self scrollViewContentSizeDidChange:nil];
}

Download .txt
gitextract_ict2499d/

├── .gitignore
├── CMPageTitleView/
│   ├── CMPageTitleView/
│   │   ├── Class/
│   │   │   ├── CMPageContentView.h
│   │   │   ├── CMPageContentView.m
│   │   │   ├── CMPageTitleConfig.h
│   │   │   ├── CMPageTitleConfig.m
│   │   │   ├── CMPageTitleContentView.h
│   │   │   ├── CMPageTitleContentView.m
│   │   │   ├── CMPageTitleView.h
│   │   │   ├── CMPageTitleView.m
│   │   │   ├── CMPageTitleViewMacro.h
│   │   │   ├── UIView+CMCommon.h
│   │   │   └── UIView+CMCommon.m
│   │   ├── Demo/
│   │   │   ├── CMChildTableController.h
│   │   │   ├── CMChildTableController.m
│   │   │   ├── CMMainTableController.h
│   │   │   ├── CMMainTableController.m
│   │   │   ├── CMViewController.h
│   │   │   └── CMViewController.m
│   │   └── Other/
│   │       ├── AppDelegate.h
│   │       ├── AppDelegate.m
│   │       ├── Assets.xcassets/
│   │       │   ├── AppIcon.appiconset/
│   │       │   │   └── Contents.json
│   │       │   ├── Contents.json
│   │       │   ├── add.imageset/
│   │       │   │   └── Contents.json
│   │       │   └── background_image.imageset/
│   │       │       └── Contents.json
│   │       ├── Base.lproj/
│   │       │   ├── LaunchScreen.storyboard
│   │       │   └── Main.storyboard
│   │       ├── Info.plist
│   │       └── main.m
│   ├── CMPageTitleView.xcodeproj/
│   │   ├── project.pbxproj
│   │   └── project.xcworkspace/
│   │       ├── contents.xcworkspacedata
│   │       └── xcshareddata/
│   │           ├── IDEWorkspaceChecks.plist
│   │           └── WorkspaceSettings.xcsettings
│   ├── CMPageTitleView.xcworkspace/
│   │   ├── contents.xcworkspacedata
│   │   └── xcshareddata/
│   │       ├── IDEWorkspaceChecks.plist
│   │       └── WorkspaceSettings.xcsettings
│   ├── Podfile
│   └── Pods/
│       ├── MJRefresh/
│       │   ├── LICENSE
│       │   ├── MJRefresh/
│       │   │   ├── Base/
│       │   │   │   ├── MJRefreshAutoFooter.h
│       │   │   │   ├── MJRefreshAutoFooter.m
│       │   │   │   ├── MJRefreshBackFooter.h
│       │   │   │   ├── MJRefreshBackFooter.m
│       │   │   │   ├── MJRefreshComponent.h
│       │   │   │   ├── MJRefreshComponent.m
│       │   │   │   ├── MJRefreshFooter.h
│       │   │   │   ├── MJRefreshFooter.m
│       │   │   │   ├── MJRefreshHeader.h
│       │   │   │   └── MJRefreshHeader.m
│       │   │   ├── Custom/
│       │   │   │   ├── Footer/
│       │   │   │   │   ├── Auto/
│       │   │   │   │   │   ├── MJRefreshAutoGifFooter.h
│       │   │   │   │   │   ├── MJRefreshAutoGifFooter.m
│       │   │   │   │   │   ├── MJRefreshAutoNormalFooter.h
│       │   │   │   │   │   ├── MJRefreshAutoNormalFooter.m
│       │   │   │   │   │   ├── MJRefreshAutoStateFooter.h
│       │   │   │   │   │   └── MJRefreshAutoStateFooter.m
│       │   │   │   │   └── Back/
│       │   │   │   │       ├── MJRefreshBackGifFooter.h
│       │   │   │   │       ├── MJRefreshBackGifFooter.m
│       │   │   │   │       ├── MJRefreshBackNormalFooter.h
│       │   │   │   │       ├── MJRefreshBackNormalFooter.m
│       │   │   │   │       ├── MJRefreshBackStateFooter.h
│       │   │   │   │       └── MJRefreshBackStateFooter.m
│       │   │   │   └── Header/
│       │   │   │       ├── MJRefreshGifHeader.h
│       │   │   │       ├── MJRefreshGifHeader.m
│       │   │   │       ├── MJRefreshNormalHeader.h
│       │   │   │       ├── MJRefreshNormalHeader.m
│       │   │   │       ├── MJRefreshStateHeader.h
│       │   │   │       └── MJRefreshStateHeader.m
│       │   │   ├── MJRefresh.bundle/
│       │   │   │   ├── en.lproj/
│       │   │   │   │   └── Localizable.strings
│       │   │   │   ├── ko.lproj/
│       │   │   │   │   └── Localizable.strings
│       │   │   │   ├── ru.lproj/
│       │   │   │   │   └── Localizable.strings
│       │   │   │   ├── uk.lproj/
│       │   │   │   │   └── Localizable.strings
│       │   │   │   ├── zh-Hans.lproj/
│       │   │   │   │   └── Localizable.strings
│       │   │   │   └── zh-Hant.lproj/
│       │   │   │       └── Localizable.strings
│       │   │   ├── MJRefresh.h
│       │   │   ├── MJRefreshConfig.h
│       │   │   ├── MJRefreshConfig.m
│       │   │   ├── MJRefreshConst.h
│       │   │   ├── MJRefreshConst.m
│       │   │   ├── NSBundle+MJRefresh.h
│       │   │   ├── NSBundle+MJRefresh.m
│       │   │   ├── UIScrollView+MJExtension.h
│       │   │   ├── UIScrollView+MJExtension.m
│       │   │   ├── UIScrollView+MJRefresh.h
│       │   │   ├── UIScrollView+MJRefresh.m
│       │   │   ├── UIView+MJExtension.h
│       │   │   └── UIView+MJExtension.m
│       │   └── README.md
│       ├── Masonry/
│       │   ├── LICENSE
│       │   ├── Masonry/
│       │   │   ├── MASCompositeConstraint.h
│       │   │   ├── MASCompositeConstraint.m
│       │   │   ├── MASConstraint+Private.h
│       │   │   ├── MASConstraint.h
│       │   │   ├── MASConstraint.m
│       │   │   ├── MASConstraintMaker.h
│       │   │   ├── MASConstraintMaker.m
│       │   │   ├── MASLayoutConstraint.h
│       │   │   ├── MASLayoutConstraint.m
│       │   │   ├── MASUtilities.h
│       │   │   ├── MASViewAttribute.h
│       │   │   ├── MASViewAttribute.m
│       │   │   ├── MASViewConstraint.h
│       │   │   ├── MASViewConstraint.m
│       │   │   ├── Masonry.h
│       │   │   ├── NSArray+MASAdditions.h
│       │   │   ├── NSArray+MASAdditions.m
│       │   │   ├── NSArray+MASShorthandAdditions.h
│       │   │   ├── NSLayoutConstraint+MASDebugAdditions.h
│       │   │   ├── NSLayoutConstraint+MASDebugAdditions.m
│       │   │   ├── View+MASAdditions.h
│       │   │   ├── View+MASAdditions.m
│       │   │   ├── View+MASShorthandAdditions.h
│       │   │   ├── ViewController+MASAdditions.h
│       │   │   └── ViewController+MASAdditions.m
│       │   └── README.md
│       ├── Pods.xcodeproj/
│       │   └── project.pbxproj
│       └── Target Support Files/
│           ├── MJRefresh/
│           │   ├── MJRefresh-Info.plist
│           │   ├── MJRefresh-dummy.m
│           │   ├── MJRefresh-prefix.pch
│           │   ├── MJRefresh-umbrella.h
│           │   ├── MJRefresh.debug.xcconfig
│           │   ├── MJRefresh.modulemap
│           │   └── MJRefresh.release.xcconfig
│           ├── Masonry/
│           │   ├── Masonry-Info.plist
│           │   ├── Masonry-dummy.m
│           │   ├── Masonry-prefix.pch
│           │   ├── Masonry-umbrella.h
│           │   ├── Masonry.debug.xcconfig
│           │   ├── Masonry.modulemap
│           │   ├── Masonry.release.xcconfig
│           │   └── Masonry.xcconfig
│           ├── Pods-CMPageTitleView/
│           │   ├── Pods-CMPageTitleView-Info.plist
│           │   ├── Pods-CMPageTitleView-acknowledgements.markdown
│           │   ├── Pods-CMPageTitleView-acknowledgements.plist
│           │   ├── Pods-CMPageTitleView-dummy.m
│           │   ├── Pods-CMPageTitleView-frameworks-Debug-input-files.xcfilelist
│           │   ├── Pods-CMPageTitleView-frameworks-Debug-output-files.xcfilelist
│           │   ├── Pods-CMPageTitleView-frameworks-Release-input-files.xcfilelist
│           │   ├── Pods-CMPageTitleView-frameworks-Release-output-files.xcfilelist
│           │   ├── Pods-CMPageTitleView-frameworks.sh
│           │   ├── Pods-CMPageTitleView-umbrella.h
│           │   ├── Pods-CMPageTitleView.debug.xcconfig
│           │   ├── Pods-CMPageTitleView.modulemap
│           │   └── Pods-CMPageTitleView.release.xcconfig
│           ├── Pods-CMPageTitleViewTests/
│           │   ├── Pods-CMPageTitleViewTests-Info.plist
│           │   ├── Pods-CMPageTitleViewTests-acknowledgements.markdown
│           │   ├── Pods-CMPageTitleViewTests-acknowledgements.plist
│           │   ├── Pods-CMPageTitleViewTests-dummy.m
│           │   ├── Pods-CMPageTitleViewTests-frameworks.sh
│           │   ├── Pods-CMPageTitleViewTests-umbrella.h
│           │   ├── Pods-CMPageTitleViewTests.debug.xcconfig
│           │   ├── Pods-CMPageTitleViewTests.modulemap
│           │   └── Pods-CMPageTitleViewTests.release.xcconfig
│           └── Pods-CMPageTitleViewUITests/
│               ├── Pods-CMPageTitleViewUITests-Info.plist
│               ├── Pods-CMPageTitleViewUITests-acknowledgements.markdown
│               ├── Pods-CMPageTitleViewUITests-acknowledgements.plist
│               ├── Pods-CMPageTitleViewUITests-dummy.m
│               ├── Pods-CMPageTitleViewUITests-umbrella.h
│               ├── Pods-CMPageTitleViewUITests.debug.xcconfig
│               ├── Pods-CMPageTitleViewUITests.modulemap
│               └── Pods-CMPageTitleViewUITests.release.xcconfig
├── CMPageTitleView.podspec
├── LICENSE
└── README.md
Download .txt
SYMBOL INDEX (11 symbols across 5 files)

FILE: CMPageTitleView/CMPageTitleView/Class/CMPageTitleConfig.h
  type CMPageTitleContentMode_Center (line 60) | typedef NS_ENUM(NSUInteger,CMPageTitleContentMode) {
  type CMPageTitleScaleGradientContentMode_Center (line 75) | typedef NS_ENUM(NSUInteger,CMPageTitleScaleGradientContentMode) {

FILE: CMPageTitleView/Pods/MJRefresh/MJRefresh/Base/MJRefreshComponent.h
  function interface (line 44) | interface MJRefreshComponent : UIView

FILE: CMPageTitleView/Pods/Masonry/Masonry/MASUtilities.h
  type UILayoutPriority (line 20) | typedef UILayoutPriority MASLayoutPriority;
  type NSLayoutPriority (line 33) | typedef NSLayoutPriority MASLayoutPriority;
  function id (line 76) | static inline id _MASBoxValue(const char *type, ...) {

FILE: CMPageTitleView/Pods/Masonry/Masonry/NSArray+MASAdditions.h
  type MASAxisTypeHorizontal (line 13) | typedef NS_ENUM(NSUInteger, MASAxisType) {

FILE: CMPageTitleView/Pods/Masonry/Masonry/View+MASShorthandAdditions.h
  function implementation (line 72) | implementation MAS_VIEW (MASShorthandAdditions)
  function block (line 119) | void(NS_NOESCAPE ^)(MASConstraintMaker *))block {
  function block (line 123) | void(NS_NOESCAPE ^)(MASConstraintMaker *))block {
  function block (line 127) | void(NS_NOESCAPE ^)(MASConstraintMaker *))block {
Condensed preview — 161 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (626K chars).
[
  {
    "path": ".gitignore",
    "chars": 252,
    "preview": "# Xcode\n\nbuild/\nDerivedData/\n*.DS_Store\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n!default.mode1v3\n*.mode2v3\n!default.mode2v3"
  },
  {
    "path": "CMPageTitleView/CMPageTitleView/Class/CMPageContentView.h",
    "chars": 1847,
    "preview": "//\n//  CMPageContentView.h\n//  CMDisplayTitleView\n//\n//  GitHub 下载地址:https://github.com/CrabMen/CMPageTitleView\n//\n\n//  "
  },
  {
    "path": "CMPageTitleView/CMPageTitleView/Class/CMPageContentView.m",
    "chars": 6061,
    "preview": "//\n//  CMPageContentView.m\n//  CMDisplayTitleView\n//\n//  GitHub 下载地址:https://github.com/CrabMen/CMPageTitleView\n//\n\n//  "
  },
  {
    "path": "CMPageTitleView/CMPageTitleView/Class/CMPageTitleConfig.h",
    "chars": 7057,
    "preview": "//\n//  CMPageTitleConfig.h\n//  CMPageTitleView\n//\n//  GitHub 下载地址:https://github.com/CrabMen/CMPageTitleView\n//\n\n//  Cre"
  },
  {
    "path": "CMPageTitleView/CMPageTitleView/Class/CMPageTitleConfig.m",
    "chars": 7482,
    "preview": "//\n//  CMPageTitlem\n//  CMPageTitleView\n//\n//  GitHub 下载地址:https://github.com/CrabMen/CMPageTitleView\n//\n\n//  Created by"
  },
  {
    "path": "CMPageTitleView/CMPageTitleView/Class/CMPageTitleContentView.h",
    "chars": 1557,
    "preview": "//\n//  CMPageTitleContentView.h\n//  CMDisplayTitleView\n//\n//  GitHub 下载地址:https://github.com/CrabMen/CMPageTitleView\n//\n"
  },
  {
    "path": "CMPageTitleView/CMPageTitleView/Class/CMPageTitleContentView.m",
    "chars": 22280,
    "preview": "//\n//  CMPageTitleContentView.m\n//  CMDisplayTitleView\n//\n//  GitHub 下载地址:https://github.com/CrabMen/CMPageTitleView\n//\n"
  },
  {
    "path": "CMPageTitleView/CMPageTitleView/Class/CMPageTitleView.h",
    "chars": 985,
    "preview": "//\n//  CMPageTitleView.h\n//  CMDisplayTitleView\n//\n//  GitHub 下载地址:https://github.com/CrabMen/CMPageTitleView\n//\n\n//  Cr"
  },
  {
    "path": "CMPageTitleView/CMPageTitleView/Class/CMPageTitleView.m",
    "chars": 10280,
    "preview": "//\n//  CMPageTitleView.m\n//  CMDisplayTitleView\n//\n//  GitHub 下载地址:https://github.com/CrabMen/CMPageTitleView\n//\n\n//  Cr"
  },
  {
    "path": "CMPageTitleView/CMPageTitleView/Class/CMPageTitleViewMacro.h",
    "chars": 471,
    "preview": "//\n//  CMPageTitleViewMacro.h\n//  CMPageTitleView\n//\n//  GitHub 下载地址:https://github.com/CrabMen/CMPageTitleView\n//\n\n//  "
  },
  {
    "path": "CMPageTitleView/CMPageTitleView/Class/UIView+CMCommon.h",
    "chars": 1108,
    "preview": "//\n//  UIView+Common.h\n//  EBan\n//\n//  GitHub 下载地址:https://github.com/CrabMen/CMPageTitleView\n//\n\n//  Created by CrabMan"
  },
  {
    "path": "CMPageTitleView/CMPageTitleView/Class/UIView+CMCommon.m",
    "chars": 3642,
    "preview": "//\n//  UIView+Common.m\n//  EBan\n//\n//  GitHub 下载地址:https://github.com/CrabMen/CMPageTitleView\n//\n//  Created by CrabMan "
  },
  {
    "path": "CMPageTitleView/CMPageTitleView/Demo/CMChildTableController.h",
    "chars": 324,
    "preview": "//\n//  CMChildController.h\n//  CMPageTitleView\n//\n//  Created by 郭强 on 2019/12/14.\n//  Copyright © 2019 CrabMan. All rig"
  },
  {
    "path": "CMPageTitleView/CMPageTitleView/Demo/CMChildTableController.m",
    "chars": 5050,
    "preview": "//\n//  CMChildController.m\n//  CMPageTitleView\n//\n//  Created by 郭强 on 2019/12/14.\n//  Copyright © 2019 CrabMan. All rig"
  },
  {
    "path": "CMPageTitleView/CMPageTitleView/Demo/CMMainTableController.h",
    "chars": 282,
    "preview": "//\n//  CMMainTableController.h\n//  CMPageTitleView\n//\n//  Created by CrabMan on 2019/4/10.\n//  Copyright © 2019 CrabMan."
  },
  {
    "path": "CMPageTitleView/CMPageTitleView/Demo/CMMainTableController.m",
    "chars": 10178,
    "preview": "//\n//  CMMainTableController.m\n//  CMPageTitleView\n//\n//  Created by CrabMan on 2019/4/10.\n//  Copyright © 2019 CrabMan."
  },
  {
    "path": "CMPageTitleView/CMPageTitleView/Demo/CMViewController.h",
    "chars": 268,
    "preview": "//\n//  CMViewController.h\n//  CMPageTitleView\n//\n//  Created by CrabMan on 2019/4/10.\n//  Copyright © 2019 CrabMan. All "
  },
  {
    "path": "CMPageTitleView/CMPageTitleView/Demo/CMViewController.m",
    "chars": 57105,
    "preview": "//\n//  CMViewController.m\n//  CMPageTitleView\n//\n//  Created by CrabMan on 2019/4/10.\n//  Copyright © 2019 CrabMan. All "
  },
  {
    "path": "CMPageTitleView/CMPageTitleView/Other/AppDelegate.h",
    "chars": 280,
    "preview": "//\n//  AppDelegate.h\n//  CMPageTitleView\n//\n//  Created by CrabMan on 2018/8/13.\n//  Copyright © 2018年 CrabMan. All righ"
  },
  {
    "path": "CMPageTitleView/CMPageTitleView/Other/AppDelegate.m",
    "chars": 2420,
    "preview": "//\n//  AppDelegate.m\n//  CMPageTitleView\n//\n//  Created by CrabMan on 2018/8/13.\n//  Copyright © 2018年 CrabMan. All righ"
  },
  {
    "path": "CMPageTitleView/CMPageTitleView/Other/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "chars": 1590,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\""
  },
  {
    "path": "CMPageTitleView/CMPageTitleView/Other/Assets.xcassets/Contents.json",
    "chars": 62,
    "preview": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "CMPageTitleView/CMPageTitleView/Other/Assets.xcassets/add.imageset/Contents.json",
    "chars": 299,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"添加.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n     "
  },
  {
    "path": "CMPageTitleView/CMPageTitleView/Other/Assets.xcassets/background_image.imageset/Contents.json",
    "chars": 313,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"background_image.jpg\",\n      \"scale\" : \"1x\"\n    "
  },
  {
    "path": "CMPageTitleView/CMPageTitleView/Other/Base.lproj/LaunchScreen.storyboard",
    "chars": 1850,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3"
  },
  {
    "path": "CMPageTitleView/CMPageTitleView/Other/Base.lproj/Main.storyboard",
    "chars": 1775,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3"
  },
  {
    "path": "CMPageTitleView/CMPageTitleView/Other/Info.plist",
    "chars": 1463,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "CMPageTitleView/CMPageTitleView/Other/main.m",
    "chars": 337,
    "preview": "//\n//  main.m\n//  CMPageTitleView\n//\n//  Created by CrabMan on 2018/8/13.\n//  Copyright © 2018年 CrabMan. All rights rese"
  },
  {
    "path": "CMPageTitleView/CMPageTitleView.xcodeproj/project.pbxproj",
    "chars": 36016,
    "preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 51;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
  },
  {
    "path": "CMPageTitleView/CMPageTitleView.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "chars": 160,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:CMPageTitleView"
  },
  {
    "path": "CMPageTitleView/CMPageTitleView.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "chars": 238,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "CMPageTitleView/CMPageTitleView.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
    "chars": 243,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "CMPageTitleView/CMPageTitleView.xcworkspace/contents.xcworkspacedata",
    "chars": 233,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:CMPageTitleVie"
  },
  {
    "path": "CMPageTitleView/CMPageTitleView.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "chars": 238,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "CMPageTitleView/CMPageTitleView.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
    "chars": 243,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "CMPageTitleView/Podfile",
    "chars": 487,
    "preview": "# Uncomment the next line to define a global platform for your project\n platform :ios, '9.0'\n\ntarget 'CMPageTitleView' d"
  },
  {
    "path": "CMPageTitleView/Pods/MJRefresh/LICENSE",
    "chars": 1100,
    "preview": "Copyright (c) 2013-2015 MJRefresh (https://github.com/CoderMJLee/MJRefresh)\n\nPermission is hereby granted, free of charg"
  },
  {
    "path": "CMPageTitleView/Pods/MJRefresh/MJRefresh/Base/MJRefreshAutoFooter.h",
    "chars": 812,
    "preview": "//\n//  MJRefreshAutoFooter.h\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 15/4/24.\n//  Copyright (c) 2015年 小码哥. All "
  },
  {
    "path": "CMPageTitleView/Pods/MJRefresh/MJRefresh/Base/MJRefreshAutoFooter.m",
    "chars": 5860,
    "preview": "//\n//  MJRefreshAutoFooter.m\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 15/4/24.\n//  Copyright (c) 2015年 小码哥. All "
  },
  {
    "path": "CMPageTitleView/Pods/MJRefresh/MJRefresh/Base/MJRefreshBackFooter.h",
    "chars": 273,
    "preview": "//\n//  MJRefreshBackFooter.h\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 15/4/24.\n//  Copyright (c) 2015年 小码哥. All "
  },
  {
    "path": "CMPageTitleView/Pods/MJRefresh/MJRefresh/Base/MJRefreshBackFooter.m",
    "chars": 5035,
    "preview": "//\n//  MJRefreshBackFooter.m\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 15/4/24.\n//  Copyright (c) 2015年 小码哥. All "
  },
  {
    "path": "CMPageTitleView/Pods/MJRefresh/MJRefresh/Base/MJRefreshComponent.h",
    "chars": 4209,
    "preview": "//  代码地址: https://github.com/CoderMJLee/MJRefresh\n//  代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90"
  },
  {
    "path": "CMPageTitleView/Pods/MJRefresh/MJRefresh/Base/MJRefreshComponent.m",
    "chars": 7947,
    "preview": "//  代码地址: https://github.com/CoderMJLee/MJRefresh\n//  代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90"
  },
  {
    "path": "CMPageTitleView/Pods/MJRefresh/MJRefresh/Base/MJRefreshFooter.h",
    "chars": 1164,
    "preview": "//  代码地址: https://github.com/CoderMJLee/MJRefresh\n//  代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90"
  },
  {
    "path": "CMPageTitleView/Pods/MJRefresh/MJRefresh/Base/MJRefreshFooter.m",
    "chars": 1501,
    "preview": "//  代码地址: https://github.com/CoderMJLee/MJRefresh\n//  代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90"
  },
  {
    "path": "CMPageTitleView/Pods/MJRefresh/MJRefresh/Base/MJRefreshHeader.h",
    "chars": 1090,
    "preview": "//  代码地址: https://github.com/CoderMJLee/MJRefresh\n//  代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90"
  },
  {
    "path": "CMPageTitleView/Pods/MJRefresh/MJRefresh/Base/MJRefreshHeader.m",
    "chars": 11009,
    "preview": "//  代码地址: https://github.com/CoderMJLee/MJRefresh\n//  代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90"
  },
  {
    "path": "CMPageTitleView/Pods/MJRefresh/MJRefresh/Custom/Footer/Auto/MJRefreshAutoGifFooter.h",
    "chars": 570,
    "preview": "//\n//  MJRefreshAutoGifFooter.h\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 15/4/24.\n//  Copyright (c) 2015年 小码哥. A"
  },
  {
    "path": "CMPageTitleView/Pods/MJRefresh/MJRefresh/Custom/Footer/Auto/MJRefreshAutoGifFooter.m",
    "chars": 2898,
    "preview": "//\n//  MJRefreshAutoGifFooter.m\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 15/4/24.\n//  Copyright (c) 2015年 小码哥. A"
  },
  {
    "path": "CMPageTitleView/Pods/MJRefresh/MJRefresh/Custom/Footer/Auto/MJRefreshAutoNormalFooter.h",
    "chars": 558,
    "preview": "//\n//  MJRefreshAutoNormalFooter.h\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 15/4/24.\n//  Copyright (c) 2015年 小码哥"
  },
  {
    "path": "CMPageTitleView/Pods/MJRefresh/MJRefresh/Custom/Footer/Auto/MJRefreshAutoNormalFooter.m",
    "chars": 2034,
    "preview": "//\n//  MJRefreshAutoNormalFooter.m\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 15/4/24.\n//  Copyright (c) 2015年 小码哥"
  },
  {
    "path": "CMPageTitleView/Pods/MJRefresh/MJRefresh/Custom/Footer/Auto/MJRefreshAutoStateFooter.h",
    "chars": 638,
    "preview": "//\n//  MJRefreshAutoStateFooter.h\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 15/6/13.\n//  Copyright © 2015年 小码哥. A"
  },
  {
    "path": "CMPageTitleView/Pods/MJRefresh/MJRefresh/Custom/Footer/Auto/MJRefreshAutoStateFooter.m",
    "chars": 2247,
    "preview": "//\n//  MJRefreshAutoStateFooter.m\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 15/6/13.\n//  Copyright © 2015年 小码哥. A"
  },
  {
    "path": "CMPageTitleView/Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackGifFooter.h",
    "chars": 570,
    "preview": "//\n//  MJRefreshBackGifFooter.h\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 15/4/24.\n//  Copyright (c) 2015年 小码哥. A"
  },
  {
    "path": "CMPageTitleView/Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackGifFooter.m",
    "chars": 3357,
    "preview": "//\n//  MJRefreshBackGifFooter.m\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 15/4/24.\n//  Copyright (c) 2015年 小码哥. A"
  },
  {
    "path": "CMPageTitleView/Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackNormalFooter.h",
    "chars": 619,
    "preview": "//\n//  MJRefreshBackNormalFooter.h\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 15/4/24.\n//  Copyright (c) 2015年 小码哥"
  },
  {
    "path": "CMPageTitleView/Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackNormalFooter.m",
    "chars": 3930,
    "preview": "//\n//  MJRefreshBackNormalFooter.m\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 15/4/24.\n//  Copyright (c) 2015年 小码哥"
  },
  {
    "path": "CMPageTitleView/Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackStateFooter.h",
    "chars": 605,
    "preview": "//\n//  MJRefreshBackStateFooter.h\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 15/6/13.\n//  Copyright © 2015年 小码哥. A"
  },
  {
    "path": "CMPageTitleView/Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackStateFooter.m",
    "chars": 2004,
    "preview": "//\n//  MJRefreshBackStateFooter.m\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 15/6/13.\n//  Copyright © 2015年 小码哥. A"
  },
  {
    "path": "CMPageTitleView/Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshGifHeader.h",
    "chars": 554,
    "preview": "//\n//  MJRefreshGifHeader.h\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 15/4/24.\n//  Copyright (c) 2015年 小码哥. All r"
  },
  {
    "path": "CMPageTitleView/Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshGifHeader.m",
    "chars": 3582,
    "preview": "//\n//  MJRefreshGifHeader.m\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 15/4/24.\n//  Copyright (c) 2015年 小码哥. All r"
  },
  {
    "path": "CMPageTitleView/Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshNormalHeader.h",
    "chars": 604,
    "preview": "//\n//  MJRefreshNormalHeader.h\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 15/4/24.\n//  Copyright (c) 2015年 小码哥. Al"
  },
  {
    "path": "CMPageTitleView/Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshNormalHeader.m",
    "chars": 4099,
    "preview": "//\n//  MJRefreshNormalHeader.m\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 15/4/24.\n//  Copyright (c) 2015年 小码哥. Al"
  },
  {
    "path": "CMPageTitleView/Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshStateHeader.h",
    "chars": 787,
    "preview": "//\n//  MJRefreshStateHeader.h\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 15/4/24.\n//  Copyright (c) 2015年 小码哥. All"
  },
  {
    "path": "CMPageTitleView/Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshStateHeader.m",
    "chars": 5071,
    "preview": "//\n//  MJRefreshStateHeader.m\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 15/4/24.\n//  Copyright (c) 2015年 小码哥. All"
  },
  {
    "path": "CMPageTitleView/Pods/MJRefresh/MJRefresh/MJRefresh.bundle/ko.lproj/Localizable.strings",
    "chars": 611,
    "preview": "\"MJRefreshHeaderIdleText\" = \"아래로 당겨 새로고침\";\n\"MJRefreshHeaderPullingText\" = \"놓으면 새로고침\";\n\"MJRefreshHeaderRefreshingText\" = "
  },
  {
    "path": "CMPageTitleView/Pods/MJRefresh/MJRefresh/MJRefresh.bundle/zh-Hant.lproj/Localizable.strings",
    "chars": 597,
    "preview": "\"MJRefreshHeaderIdleText\" = \"下拉可以刷新\";\n\"MJRefreshHeaderPullingText\" = \"鬆開立即刷新\";\n\"MJRefreshHeaderRefreshingText\" = \"正在刷新數據"
  },
  {
    "path": "CMPageTitleView/Pods/MJRefresh/MJRefresh/MJRefresh.h",
    "chars": 516,
    "preview": "//  代码地址: https://github.com/CoderMJLee/MJRefresh\n//  代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90"
  },
  {
    "path": "CMPageTitleView/Pods/MJRefresh/MJRefresh/MJRefreshConfig.h",
    "chars": 491,
    "preview": "//\n//  MJRefreshConfig.h\n//\n//  Created by Frank on 2018/11/27.\n//  Copyright © 2018 小码哥. All rights reserved.\n//\n\n#impo"
  },
  {
    "path": "CMPageTitleView/Pods/MJRefresh/MJRefresh/MJRefreshConfig.m",
    "chars": 424,
    "preview": "//\n//  MJRefreshConfig.m\n//\n//  Created by Frank on 2018/11/27.\n//  Copyright © 2018 小码哥. All rights reserved.\n//\n\n#impo"
  },
  {
    "path": "CMPageTitleView/Pods/MJRefresh/MJRefresh/MJRefreshConst.h",
    "chars": 2633,
    "preview": "//  代码地址: https://github.com/CoderMJLee/MJRefresh\n//  代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90"
  },
  {
    "path": "CMPageTitleView/Pods/MJRefresh/MJRefresh/MJRefreshConst.m",
    "chars": 1874,
    "preview": "//  代码地址: https://github.com/CoderMJLee/MJRefresh\n//  代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90"
  },
  {
    "path": "CMPageTitleView/Pods/MJRefresh/MJRefresh/NSBundle+MJRefresh.h",
    "chars": 455,
    "preview": "//\n//  NSBundle+MJRefresh.h\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 16/6/13.\n//  Copyright © 2016年 小码哥. All rig"
  },
  {
    "path": "CMPageTitleView/Pods/MJRefresh/MJRefresh/NSBundle+MJRefresh.m",
    "chars": 2423,
    "preview": "//\n//  NSBundle+MJRefresh.m\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 16/6/13.\n//  Copyright © 2016年 小码哥. All rig"
  },
  {
    "path": "CMPageTitleView/Pods/MJRefresh/MJRefresh/UIScrollView+MJExtension.h",
    "chars": 913,
    "preview": "//  代码地址: https://github.com/CoderMJLee/MJRefresh\n//  代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90"
  },
  {
    "path": "CMPageTitleView/Pods/MJRefresh/MJRefresh/UIScrollView+MJExtension.m",
    "chars": 3307,
    "preview": "//  代码地址: https://github.com/CoderMJLee/MJRefresh\n//  代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90"
  },
  {
    "path": "CMPageTitleView/Pods/MJRefresh/MJRefresh/UIScrollView+MJRefresh.h",
    "chars": 969,
    "preview": "//  代码地址: https://github.com/CoderMJLee/MJRefresh\n//  代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90"
  },
  {
    "path": "CMPageTitleView/Pods/MJRefresh/MJRefresh/UIScrollView+MJRefresh.m",
    "chars": 2576,
    "preview": "//  代码地址: https://github.com/CoderMJLee/MJRefresh\n//  代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90"
  },
  {
    "path": "CMPageTitleView/Pods/MJRefresh/MJRefresh/UIView+MJExtension.h",
    "chars": 714,
    "preview": "// 代码地址: https://github.com/CoderMJLee/MJRefresh\n// 代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E"
  },
  {
    "path": "CMPageTitleView/Pods/MJRefresh/MJRefresh/UIView+MJExtension.m",
    "chars": 1456,
    "preview": "//  代码地址: https://github.com/CoderMJLee/MJRefresh\n//  代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90"
  },
  {
    "path": "CMPageTitleView/Pods/MJRefresh/README.md",
    "chars": 16605,
    "preview": "## MJRefresh\n[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://gi"
  },
  {
    "path": "CMPageTitleView/Pods/Masonry/LICENSE",
    "chars": 1089,
    "preview": "Copyright (c) 2011-2012 Masonry Team - https://github.com/Masonry\n\nPermission is hereby granted, free of charge, to any "
  },
  {
    "path": "CMPageTitleView/Pods/Masonry/Masonry/MASCompositeConstraint.h",
    "chars": 494,
    "preview": "//\n//  MASCompositeConstraint.h\n//  Masonry\n//\n//  Created by Jonas Budelmann on 21/07/13.\n//  Copyright (c) 2013 cloudl"
  },
  {
    "path": "CMPageTitleView/Pods/Masonry/Masonry/MASCompositeConstraint.m",
    "chars": 4870,
    "preview": "//\n//  MASCompositeConstraint.m\n//  Masonry\n//\n//  Created by Jonas Budelmann on 21/07/13.\n//  Copyright (c) 2013 cloudl"
  },
  {
    "path": "CMPageTitleView/Pods/Masonry/Masonry/MASConstraint+Private.h",
    "chars": 1785,
    "preview": "//\n//  MASConstraint+Private.h\n//  Masonry\n//\n//  Created by Nick Tymchenko on 29/04/14.\n//  Copyright (c) 2014 cloudlin"
  },
  {
    "path": "CMPageTitleView/Pods/Masonry/Masonry/MASConstraint.h",
    "chars": 7872,
    "preview": "//\n//  MASConstraint.h\n//  Masonry\n//\n//  Created by Jonas Budelmann on 22/07/13.\n//  Copyright (c) 2013 cloudling. All "
  },
  {
    "path": "CMPageTitleView/Pods/Masonry/Masonry/MASConstraint.m",
    "chars": 8233,
    "preview": "//\n//  MASConstraint.m\n//  Masonry\n//\n//  Created by Nick Tymchenko on 1/20/14.\n//\n\n#import \"MASConstraint.h\"\n#import \"M"
  },
  {
    "path": "CMPageTitleView/Pods/Masonry/Masonry/MASConstraintMaker.h",
    "chars": 5734,
    "preview": "//\n//  MASConstraintMaker.h\n//  Masonry\n//\n//  Created by Jonas Budelmann on 20/07/13.\n//  Copyright (c) 2013 cloudling."
  },
  {
    "path": "CMPageTitleView/Pods/Masonry/Masonry/MASConstraintMaker.m",
    "chars": 10450,
    "preview": "//\n//  MASConstraintMaker.m\n//  Masonry\n//\n//  Created by Jonas Budelmann on 20/07/13.\n//  Copyright (c) 2013 cloudling."
  },
  {
    "path": "CMPageTitleView/Pods/Masonry/Masonry/MASLayoutConstraint.h",
    "chars": 505,
    "preview": "//\n//  MASLayoutConstraint.h\n//  Masonry\n//\n//  Created by Jonas Budelmann on 3/08/13.\n//  Copyright (c) 2013 Jonas Bude"
  },
  {
    "path": "CMPageTitleView/Pods/Masonry/Masonry/MASLayoutConstraint.m",
    "chars": 227,
    "preview": "//\n//  MASLayoutConstraint.m\n//  Masonry\n//\n//  Created by Jonas Budelmann on 3/08/13.\n//  Copyright (c) 2013 Jonas Bude"
  },
  {
    "path": "CMPageTitleView/Pods/Masonry/Masonry/MASUtilities.h",
    "chars": 6273,
    "preview": "//\n//  MASUtilities.h\n//  Masonry\n//\n//  Created by Jonas Budelmann on 19/08/13.\n//  Copyright (c) 2013 Jonas Budelmann."
  },
  {
    "path": "CMPageTitleView/Pods/Masonry/Masonry/MASViewAttribute.h",
    "chars": 1221,
    "preview": "//\n//  MASViewAttribute.h\n//  Masonry\n//\n//  Created by Jonas Budelmann on 21/07/13.\n//  Copyright (c) 2013 cloudling. A"
  },
  {
    "path": "CMPageTitleView/Pods/Masonry/Masonry/MASViewAttribute.m",
    "chars": 1195,
    "preview": "//\n//  MASViewAttribute.m\n//  Masonry\n//\n//  Created by Jonas Budelmann on 21/07/13.\n//  Copyright (c) 2013 cloudling. A"
  },
  {
    "path": "CMPageTitleView/Pods/Masonry/Masonry/MASViewConstraint.h",
    "chars": 1279,
    "preview": "//\n//  MASViewConstraint.h\n//  Masonry\n//\n//  Created by Jonas Budelmann on 20/07/13.\n//  Copyright (c) 2013 cloudling. "
  },
  {
    "path": "CMPageTitleView/Pods/Masonry/Masonry/MASViewConstraint.m",
    "chars": 13358,
    "preview": "//\n//  MASViewConstraint.m\n//  Masonry\n//\n//  Created by Jonas Budelmann on 20/07/13.\n//  Copyright (c) 2013 cloudling. "
  },
  {
    "path": "CMPageTitleView/Pods/Masonry/Masonry/Masonry.h",
    "chars": 802,
    "preview": "//\n//  Masonry.h\n//  Masonry\n//\n//  Created by Jonas Budelmann on 20/07/13.\n//  Copyright (c) 2013 cloudling. All rights"
  },
  {
    "path": "CMPageTitleView/Pods/Masonry/Masonry/NSArray+MASAdditions.h",
    "chars": 2789,
    "preview": "//\n//  NSArray+MASAdditions.h\n//\n//\n//  Created by Daniel Hammond on 11/26/13.\n//\n//\n\n#import \"MASUtilities.h\"\n#import \""
  },
  {
    "path": "CMPageTitleView/Pods/Masonry/Masonry/NSArray+MASAdditions.m",
    "chars": 6154,
    "preview": "//\n//  NSArray+MASAdditions.m\n//  \n//\n//  Created by Daniel Hammond on 11/26/13.\n//\n//\n\n#import \"NSArray+MASAdditions.h\""
  },
  {
    "path": "CMPageTitleView/Pods/Masonry/Masonry/NSArray+MASShorthandAdditions.h",
    "chars": 1016,
    "preview": "//\n//  NSArray+MASShorthandAdditions.h\n//  Masonry\n//\n//  Created by Jonas Budelmann on 22/07/13.\n//  Copyright (c) 2013"
  },
  {
    "path": "CMPageTitleView/Pods/Masonry/Masonry/NSLayoutConstraint+MASDebugAdditions.h",
    "chars": 326,
    "preview": "//\n//  NSLayoutConstraint+MASDebugAdditions.h\n//  Masonry\n//\n//  Created by Jonas Budelmann on 3/08/13.\n//  Copyright (c"
  },
  {
    "path": "CMPageTitleView/Pods/Masonry/Masonry/NSLayoutConstraint+MASDebugAdditions.m",
    "chars": 5771,
    "preview": "//\n//  NSLayoutConstraint+MASDebugAdditions.m\n//  Masonry\n//\n//  Created by Jonas Budelmann on 3/08/13.\n//  Copyright (c"
  },
  {
    "path": "CMPageTitleView/Pods/Masonry/Masonry/View+MASAdditions.h",
    "chars": 4894,
    "preview": "//\n//  UIView+MASAdditions.h\n//  Masonry\n//\n//  Created by Jonas Budelmann on 20/07/13.\n//  Copyright (c) 2013 cloudling"
  },
  {
    "path": "CMPageTitleView/Pods/Masonry/Masonry/View+MASAdditions.m",
    "chars": 6573,
    "preview": "//\n//  UIView+MASAdditions.m\n//  Masonry\n//\n//  Created by Jonas Budelmann on 20/07/13.\n//  Copyright (c) 2013 cloudling"
  },
  {
    "path": "CMPageTitleView/Pods/Masonry/Masonry/View+MASShorthandAdditions.h",
    "chars": 4772,
    "preview": "//\n//  UIView+MASShorthandAdditions.h\n//  Masonry\n//\n//  Created by Jonas Budelmann on 22/07/13.\n//  Copyright (c) 2013 "
  },
  {
    "path": "CMPageTitleView/Pods/Masonry/Masonry/ViewController+MASAdditions.h",
    "chars": 891,
    "preview": "//\n//  UIViewController+MASAdditions.h\n//  Masonry\n//\n//  Created by Craig Siemens on 2015-06-23.\n//\n//\n\n#import \"MASUti"
  },
  {
    "path": "CMPageTitleView/Pods/Masonry/Masonry/ViewController+MASAdditions.m",
    "chars": 1302,
    "preview": "//\n//  UIViewController+MASAdditions.m\n//  Masonry\n//\n//  Created by Craig Siemens on 2015-06-23.\n//\n//\n\n#import \"ViewCo"
  },
  {
    "path": "CMPageTitleView/Pods/Masonry/README.md",
    "chars": 16167,
    "preview": "# Masonry [![Build Status](https://travis-ci.org/SnapKit/Masonry.svg?branch=master)](https://travis-ci.org/SnapKit/Mason"
  },
  {
    "path": "CMPageTitleView/Pods/Pods.xcodeproj/project.pbxproj",
    "chars": 94577,
    "preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 51;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
  },
  {
    "path": "CMPageTitleView/Pods/Target Support Files/MJRefresh/MJRefresh-Info.plist",
    "chars": 828,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "CMPageTitleView/Pods/Target Support Files/MJRefresh/MJRefresh-dummy.m",
    "chars": 122,
    "preview": "#import <Foundation/Foundation.h>\n@interface PodsDummy_MJRefresh : NSObject\n@end\n@implementation PodsDummy_MJRefresh\n@en"
  },
  {
    "path": "CMPageTitleView/Pods/Target Support Files/MJRefresh/MJRefresh-prefix.pch",
    "chars": 195,
    "preview": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPO"
  },
  {
    "path": "CMPageTitleView/Pods/Target Support Files/MJRefresh/MJRefresh-umbrella.h",
    "chars": 990,
    "preview": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPO"
  },
  {
    "path": "CMPageTitleView/Pods/Target Support Files/MJRefresh/MJRefresh.debug.xcconfig",
    "chars": 460,
    "preview": "CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPOD"
  },
  {
    "path": "CMPageTitleView/Pods/Target Support Files/MJRefresh/MJRefresh.modulemap",
    "chars": 108,
    "preview": "framework module MJRefresh {\n  umbrella header \"MJRefresh-umbrella.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "CMPageTitleView/Pods/Target Support Files/MJRefresh/MJRefresh.release.xcconfig",
    "chars": 460,
    "preview": "CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPOD"
  },
  {
    "path": "CMPageTitleView/Pods/Target Support Files/Masonry/Masonry-Info.plist",
    "chars": 828,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "CMPageTitleView/Pods/Target Support Files/Masonry/Masonry-dummy.m",
    "chars": 118,
    "preview": "#import <Foundation/Foundation.h>\n@interface PodsDummy_Masonry : NSObject\n@end\n@implementation PodsDummy_Masonry\n@end\n"
  },
  {
    "path": "CMPageTitleView/Pods/Target Support Files/Masonry/Masonry-prefix.pch",
    "chars": 195,
    "preview": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPO"
  },
  {
    "path": "CMPageTitleView/Pods/Target Support Files/Masonry/Masonry-umbrella.h",
    "chars": 801,
    "preview": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPO"
  },
  {
    "path": "CMPageTitleView/Pods/Target Support Files/Masonry/Masonry.debug.xcconfig",
    "chars": 528,
    "preview": "CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Masonry\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS="
  },
  {
    "path": "CMPageTitleView/Pods/Target Support Files/Masonry/Masonry.modulemap",
    "chars": 104,
    "preview": "framework module Masonry {\n  umbrella header \"Masonry-umbrella.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "CMPageTitleView/Pods/Target Support Files/Masonry/Masonry.release.xcconfig",
    "chars": 528,
    "preview": "CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Masonry\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS="
  },
  {
    "path": "CMPageTitleView/Pods/Target Support Files/Masonry/Masonry.xcconfig",
    "chars": 477,
    "preview": "CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Masonry\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS="
  },
  {
    "path": "CMPageTitleView/Pods/Target Support Files/Pods-CMPageTitleView/Pods-CMPageTitleView-Info.plist",
    "chars": 828,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "CMPageTitleView/Pods/Target Support Files/Pods-CMPageTitleView/Pods-CMPageTitleView-acknowledgements.markdown",
    "chars": 2352,
    "preview": "# Acknowledgements\nThis application makes use of the following third party libraries:\n\n## MJRefresh\n\nCopyright (c) 2013-"
  },
  {
    "path": "CMPageTitleView/Pods/Target Support Files/Pods-CMPageTitleView/Pods-CMPageTitleView-acknowledgements.plist",
    "chars": 3426,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "CMPageTitleView/Pods/Target Support Files/Pods-CMPageTitleView/Pods-CMPageTitleView-dummy.m",
    "chars": 144,
    "preview": "#import <Foundation/Foundation.h>\n@interface PodsDummy_Pods_CMPageTitleView : NSObject\n@end\n@implementation PodsDummy_Po"
  },
  {
    "path": "CMPageTitleView/Pods/Target Support Files/Pods-CMPageTitleView/Pods-CMPageTitleView-frameworks-Debug-input-files.xcfilelist",
    "chars": 189,
    "preview": "${PODS_ROOT}/Target Support Files/Pods-CMPageTitleView/Pods-CMPageTitleView-frameworks.sh\n${BUILT_PRODUCTS_DIR}/MJRefres"
  },
  {
    "path": "CMPageTitleView/Pods/Target Support Files/Pods-CMPageTitleView/Pods-CMPageTitleView-frameworks-Debug-output-files.xcfilelist",
    "chars": 129,
    "preview": "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MJRefresh.framework\n${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Masonry."
  },
  {
    "path": "CMPageTitleView/Pods/Target Support Files/Pods-CMPageTitleView/Pods-CMPageTitleView-frameworks-Release-input-files.xcfilelist",
    "chars": 189,
    "preview": "${PODS_ROOT}/Target Support Files/Pods-CMPageTitleView/Pods-CMPageTitleView-frameworks.sh\n${BUILT_PRODUCTS_DIR}/MJRefres"
  },
  {
    "path": "CMPageTitleView/Pods/Target Support Files/Pods-CMPageTitleView/Pods-CMPageTitleView-frameworks-Release-output-files.xcfilelist",
    "chars": 129,
    "preview": "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MJRefresh.framework\n${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Masonry."
  },
  {
    "path": "CMPageTitleView/Pods/Target Support Files/Pods-CMPageTitleView/Pods-CMPageTitleView-frameworks.sh",
    "chars": 8903,
    "preview": "#!/bin/sh\nset -e\nset -u\nset -o pipefail\n\nfunction on_error {\n  echo \"$(realpath -mq \"${0}\"):$1: error: Unexpected failur"
  },
  {
    "path": "CMPageTitleView/Pods/Target Support Files/Pods-CMPageTitleView/Pods-CMPageTitleView-umbrella.h",
    "chars": 332,
    "preview": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPO"
  },
  {
    "path": "CMPageTitleView/Pods/Target Support Files/Pods-CMPageTitleView/Pods-CMPageTitleView.debug.xcconfig",
    "chars": 804,
    "preview": "FRAMEWORK_SEARCH_PATHS = $(inherited) \"${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh\" \"${PODS_CONFIGURATION_BUILD_DIR}/Mason"
  },
  {
    "path": "CMPageTitleView/Pods/Target Support Files/Pods-CMPageTitleView/Pods-CMPageTitleView.modulemap",
    "chars": 130,
    "preview": "framework module Pods_CMPageTitleView {\n  umbrella header \"Pods-CMPageTitleView-umbrella.h\"\n\n  export *\n  module * { exp"
  },
  {
    "path": "CMPageTitleView/Pods/Target Support Files/Pods-CMPageTitleView/Pods-CMPageTitleView.release.xcconfig",
    "chars": 804,
    "preview": "FRAMEWORK_SEARCH_PATHS = $(inherited) \"${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh\" \"${PODS_CONFIGURATION_BUILD_DIR}/Mason"
  },
  {
    "path": "CMPageTitleView/Pods/Target Support Files/Pods-CMPageTitleViewTests/Pods-CMPageTitleViewTests-Info.plist",
    "chars": 828,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "CMPageTitleView/Pods/Target Support Files/Pods-CMPageTitleViewTests/Pods-CMPageTitleViewTests-acknowledgements.markdown",
    "chars": 133,
    "preview": "# Acknowledgements\nThis application makes use of the following third party libraries:\nGenerated by CocoaPods - https://c"
  },
  {
    "path": "CMPageTitleView/Pods/Target Support Files/Pods-CMPageTitleViewTests/Pods-CMPageTitleViewTests-acknowledgements.plist",
    "chars": 805,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "CMPageTitleView/Pods/Target Support Files/Pods-CMPageTitleViewTests/Pods-CMPageTitleViewTests-dummy.m",
    "chars": 154,
    "preview": "#import <Foundation/Foundation.h>\n@interface PodsDummy_Pods_CMPageTitleViewTests : NSObject\n@end\n@implementation PodsDum"
  },
  {
    "path": "CMPageTitleView/Pods/Target Support Files/Pods-CMPageTitleViewTests/Pods-CMPageTitleViewTests-frameworks.sh",
    "chars": 7223,
    "preview": "#!/bin/sh\nset -e\nset -u\nset -o pipefail\n\nfunction on_error {\n  echo \"$(realpath -mq \"${0}\"):$1: error: Unexpected failur"
  },
  {
    "path": "CMPageTitleView/Pods/Target Support Files/Pods-CMPageTitleViewTests/Pods-CMPageTitleViewTests-umbrella.h",
    "chars": 342,
    "preview": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPO"
  },
  {
    "path": "CMPageTitleView/Pods/Target Support Files/Pods-CMPageTitleViewTests/Pods-CMPageTitleViewTests.debug.xcconfig",
    "chars": 709,
    "preview": "FRAMEWORK_SEARCH_PATHS = $(inherited) \"${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh\" \"${PODS_CONFIGURATION_BUILD_DIR}/Mason"
  },
  {
    "path": "CMPageTitleView/Pods/Target Support Files/Pods-CMPageTitleViewTests/Pods-CMPageTitleViewTests.modulemap",
    "chars": 140,
    "preview": "framework module Pods_CMPageTitleViewTests {\n  umbrella header \"Pods-CMPageTitleViewTests-umbrella.h\"\n\n  export *\n  modu"
  },
  {
    "path": "CMPageTitleView/Pods/Target Support Files/Pods-CMPageTitleViewTests/Pods-CMPageTitleViewTests.release.xcconfig",
    "chars": 709,
    "preview": "FRAMEWORK_SEARCH_PATHS = $(inherited) \"${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh\" \"${PODS_CONFIGURATION_BUILD_DIR}/Mason"
  },
  {
    "path": "CMPageTitleView/Pods/Target Support Files/Pods-CMPageTitleViewUITests/Pods-CMPageTitleViewUITests-Info.plist",
    "chars": 828,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "CMPageTitleView/Pods/Target Support Files/Pods-CMPageTitleViewUITests/Pods-CMPageTitleViewUITests-acknowledgements.markdown",
    "chars": 133,
    "preview": "# Acknowledgements\nThis application makes use of the following third party libraries:\nGenerated by CocoaPods - https://c"
  },
  {
    "path": "CMPageTitleView/Pods/Target Support Files/Pods-CMPageTitleViewUITests/Pods-CMPageTitleViewUITests-acknowledgements.plist",
    "chars": 805,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "CMPageTitleView/Pods/Target Support Files/Pods-CMPageTitleViewUITests/Pods-CMPageTitleViewUITests-dummy.m",
    "chars": 158,
    "preview": "#import <Foundation/Foundation.h>\n@interface PodsDummy_Pods_CMPageTitleViewUITests : NSObject\n@end\n@implementation PodsD"
  },
  {
    "path": "CMPageTitleView/Pods/Target Support Files/Pods-CMPageTitleViewUITests/Pods-CMPageTitleViewUITests-umbrella.h",
    "chars": 346,
    "preview": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPO"
  },
  {
    "path": "CMPageTitleView/Pods/Target Support Files/Pods-CMPageTitleViewUITests/Pods-CMPageTitleViewUITests.debug.xcconfig",
    "chars": 709,
    "preview": "FRAMEWORK_SEARCH_PATHS = $(inherited) \"${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh\" \"${PODS_CONFIGURATION_BUILD_DIR}/Mason"
  },
  {
    "path": "CMPageTitleView/Pods/Target Support Files/Pods-CMPageTitleViewUITests/Pods-CMPageTitleViewUITests.modulemap",
    "chars": 144,
    "preview": "framework module Pods_CMPageTitleViewUITests {\n  umbrella header \"Pods-CMPageTitleViewUITests-umbrella.h\"\n\n  export *\n  "
  },
  {
    "path": "CMPageTitleView/Pods/Target Support Files/Pods-CMPageTitleViewUITests/Pods-CMPageTitleViewUITests.release.xcconfig",
    "chars": 709,
    "preview": "FRAMEWORK_SEARCH_PATHS = $(inherited) \"${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh\" \"${PODS_CONFIGURATION_BUILD_DIR}/Mason"
  },
  {
    "path": "CMPageTitleView.podspec",
    "chars": 497,
    "preview": "Pod::Spec.new do |s|\n    s.name         = 'CMPageTitleView'\n    s.version      = '0.7.4'\n    s.summary      = 'An easy w"
  },
  {
    "path": "LICENSE",
    "chars": 1064,
    "preview": "MIT License\n\nCopyright (c) 2018 CrabMan\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof"
  },
  {
    "path": "README.md",
    "chars": 18243,
    "preview": "![](https://github.com/CrabMen/CMResources/blob/master/CMPageTitleView/logo.png)\n\n![](https://img.shields.io/cocoapods/p"
  }
]

// ... and 4 more files (download for full content)

About this extraction

This page contains the full source code of the CrabMen/CMPageTitleView GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 161 files (552.9 KB), approximately 163.4k tokens, and a symbol index with 11 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!