(iOS)父子控制器

作者: RocketsChen | 来源:发表于2017-09-05 17:35 被阅读1554次
最近发现很多项目中都有用到父子控制器切换界面的功能,就着手封装一个简易的小框架CDDPagerController,本着能简单就简单的原则,实现功能如下:
Demo简介

1.集成方式1

  • 去GitHub上下载我的开源项目:CDDPagerController
  • 打开文件夹找到CDDPagerController文件,拖到自己项目中
  • 继承框架内头文件#import "DCPagerController.h"
  • 根据需求调用DCPagerController.h的方法

集成方式2

  • 集成pods 使用方式 在Podfile中加入 pod 'CDDPagerController'即可~
/**
 根据角标,跳转到对应的控制器(viewWillAppear方法里实现)
 */
@property (nonatomic, assign) NSInteger selectIndex;

/**
 字体缩放
 */
- (void)setUpTitleScale:(void(^)(CGFloat *titleScale))titleScaleBlock;

/**
 progress设置
 *progressLength        设置progress长度
 *progressHeight        设置progress高度
 */
- (void)setUpProgressAttribute:(void(^)(CGFloat *progressLength, CGFloat *progressHeight))settingProgressBlock;

/**
 初始化
 
 *titleScrollViewBgColor 标题背景色
 *norColor               标题字体未选中状态下颜色
 *selColor               标题字体选中状态下颜色
 *proColor               字体下方指示器颜色
 *titleFont              标题字体大小
 *isShowPregressView     是否开启字体下方指示器
 *isOpenStretch          是否开启指示器拉伸效果
 *isOpenShade            是否开启字体渐变效果

 @param BaseSettingBlock 设置基本属性
 */
- (void)setUpDisplayStyle:(void(^)(UIColor **titleScrollViewBgColor,UIColor **norColor,UIColor **selColor,UIColor **proColor,UIFont **titleFont,BOOL *isShowPregressView,BOOL *isOpenStretch,BOOL *isOpenShade))BaseSettingBlock;


2.Demo事列(含GIF图)

type01
DemoType01

a.继承

#import "DCPagerController.h"

@interface DCDemo01ViewController : DCPagerController

b.实现

#pragma mark - LazyLoad
-(void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    
//    self.selectIndex = 3; //默认选择第几个设置(不设置则默认选择第0个)
    
}

#pragma mark - LifeCyle
- (void)viewDidLoad {
    
    [super viewDidLoad];
    
    [self setUpAllChildViewController];
    
    [self setUpDisplayStyle:^(UIColor *__autoreleasing *titleScrollViewBgColor, UIColor *__autoreleasing *norColor, UIColor *__autoreleasing *selColor, UIColor *__autoreleasing *proColor, UIFont *__autoreleasing *titleFont, BOOL *isShowProgressView, BOOL *isOpenStretch, BOOL *isOpenShade) {
        *titleScrollViewBgColor = [UIColor whiteColor]; //标题View背景色(默认标题背景色为白色)
        *norColor = [UIColor darkGrayColor];            //标题未选中颜色(默认未选中状态下字体颜色为黑色)
        *selColor = [UIColor orangeColor];              //标题选中颜色(默认选中状态下字体颜色为红色)
        *proColor = [UIColor purpleColor];              //滚动条颜色(默认为标题选中颜色)
        *titleFont = [UIFont systemFontOfSize:16];      //字体尺寸 (默认fontSize为15)
        
        /*
         以下BOOL值默认都为NO
         */
        *isShowProgressView = YES;                      //是否开启标题下部Pregress指示器
        *isOpenStretch = YES;                           //是否开启指示器拉伸效果
        *isOpenShade = YES;                             //是否开启字体渐变
    }];
    
    
    [self setUpTitleScale:^(CGFloat *titleScale) { //titleScale范围在0到1之间  <0 或者 > 1 则默认不缩放 默认设置titleScale就开启缩放,不设置则关闭
        *titleScale = 0.1;
    }];
    
    
    [self setUpProgressAttribute:^(CGFloat *progressLength, CGFloat *progressHeight) {//progressLength 设置底部progress指示器的长度,有默认值为按钮的宽度的百分之56  progressHeight默认高度4(并且不能大于10)
        *progressLength = 40;
        *progressHeight = 5;
    }];
    
}

#pragma mark - 添加所有子控制器
- (void)setUpAllChildViewController
{
    NSArray *titles = @[@"测试01",@"测试02",@"测试03",@"测试04",@"测试05"];
    for (NSInteger i = 0; i < titles.count; i++) {
        UIViewController *vc = [UIViewController new];
        vc.title = titles[i];
        vc.view.backgroundColor = RandColor; //随机色
        [self addChildViewController:vc];
    }
}

Demo中其他几种Type
DemoType02
- (void)viewDidLoad {
    
    [super viewDidLoad];
    
    [self setUpAllChildViewController];
    
    [self setUpDisplayStyle:^(UIColor *__autoreleasing *titleScrollViewBgColor, UIColor *__autoreleasing *norColor, UIColor *__autoreleasing *selColor, UIColor *__autoreleasing *proColor, UIFont *__autoreleasing *titleFont, BOOL *isShowProgressView, BOOL *isOpenStretch, BOOL *isOpenShade) {
        
        *titleFont = [UIFont systemFontOfSize:16];
        
        *isShowProgressView = YES;                      //是否开启标题下部Pregress指示器
        *isOpenStretch = YES;                           //是否开启指示器拉伸效果
        *isOpenShade = YES;                             //是否开启字体渐变
    }];

}

#pragma mark - 添加所有子控制器
- (void)setUpAllChildViewController
{
    NSArray *titles = @[@"测试01",@"测试02",@"测试03",@"测试04"];
    for (NSInteger i = 0; i < titles.count; i++) {
        UIViewController *vc = [UIViewController new];
        vc.title = titles[i];
        vc.view.backgroundColor = RandColor; //随机色
        [self addChildViewController:vc];
    }
}

DemoType03
#pragma mark - LifeCyle
- (void)viewDidLoad {
    
    [super viewDidLoad];
    
    [self setUpAllChildViewController];
    
}

#pragma mark - 添加所有子控制器
- (void)setUpAllChildViewController
{
    NSArray *titles = @[@"测试01",@"测试02",@"测试03"];
    for (NSInteger i = 0; i < titles.count; i++) {
        UIViewController *vc = [UIViewController new];
        vc.title = titles[i];
        vc.view.backgroundColor = RandColor; //随机色
        [self addChildViewController:vc];
    }
}

DemoType04
#pragma mark - LifeCyle
- (void)viewDidLoad {
    
    [super viewDidLoad];
    
    [self setUpAllChildViewController];
    
    [self setUpDisplayStyle:^(UIColor *__autoreleasing *titleScrollViewBgColor, UIColor *__autoreleasing *norColor, UIColor *__autoreleasing *selColor, UIColor *__autoreleasing *proColor, UIFont *__autoreleasing *titleFont, BOOL *isShowProgressView, BOOL *isOpenStretch, BOOL *isOpenShade) {
       
        *selColor = [UIColor orangeColor];

        *isOpenShade = YES;
    }];
    
    [self setUpTitleScale:^(CGFloat *titleScale) { //titleScale范围在0到1之间  <0 或者 > 1 则默认不缩放 默认设置titleScale就开启缩放,不设置则关闭
        *titleScale = 0.3;
    }];
}

#pragma mark - 添加所有子控制器
- (void)setUpAllChildViewController
{
    NSArray *titles = @[@"测试01",@"测试02",@"测试03",@"测试04",@"测试05",@"测试06",@"测试07",@"测试08",@"测试09"];
    for (NSInteger i = 0; i < titles.count; i++) {
        UIViewController *vc = [UIViewController new];
        vc.title = titles[i];
        vc.view.backgroundColor = RandColor; //随机色
        [self addChildViewController:vc];
    }
}

框架已上传到GitHub,欢迎下载,喜欢的话点个Star
Git地址:https://github.com/RocketsChen/CDDPagerController

相关文章

  • iOS 父子控制器

    父子控制器 在 iOS 开发中我们经常用到的两大父子控制器分别是:UINavigationController 和...

  • 父子控制器相关

    父子控制器:导航控制器,UITabBarViewController等。 父子控制器的设计原理:a控制器的View...

  • 创建类似于网易新闻的头部

    网易新闻的头部点击切换不同界面主要运用到了iOS中父子控制器知识点。

  • (iOS)父子控制器

    最近发现很多项目中都有用到父子控制器切换界面的功能,就着手封装一个简易的小框架CDDPagerController...

  • 父子控制器相关

    父子控制器相关 控制器父子关系的建立原则 如果2个控制器的view是父子关系(不管是直接还是间接的父子关系),那么...

  • 父子控制器

    父子控制器的小tips 控制器父子关系的建立原则 如果两个控制器的view是父子关系(不管直接还是间接的父子关系)...

  • 父子控制器详细解析

    父子控制器详细解析(一)父子控制器详细解析(二) —— 添加视图的层级问题

  • 父子控件、static的作用

    控制器父子关系的建立原则 - 如果2个控制器的view是父子关系(不管是直接还是间接的父子关系),那么这2个控制器...

  • iOS-父子控制器

    控制器父子关系的建立原则 如果2个控制器的view是父子关系(不管是直接还是间接的父子关系),那么这2个控制器也应...

  • iOS-父子控制器

    效果图 原理 与系统的UITabBarController类似,现实自定义的类似功能,采用父子控制器架构来管理; ...

网友评论

  • 晴昼:在自控制器下添加collection,MJRefresh下拉刷新的时候mj_header上面的label,img 偏移出屏幕了
    晴昼:@RocketsChen 评论好像没办法发截图
    晴昼:@RocketsChen 加我qq吧 604630178
    RocketsChen:@晴昼 方便的话可以让我看一下截图?
  • MissSunRise:大神 我继承了这个View 但是想添加我自己的Bar 我要怎么做??
  • shuolol:pod 'CDDPagerController' 用不了
    [!] Unable to find a specification for `CDDPagerController`
  • HuyaRC:就我一个人发现CDDPagerController中“Pager”单词写错了吗?作者应该是想写“Page”吧!!!pager是传呼机的意思啊!但是文章还有写的不错的。
  • Kris_A:你好,[self setUpDisplayStyle:^(UIColor *__autoreleasing *titleScrollViewBgColor, UIColor *__autoreleasing *norColor, UIColor *__autoreleasing *selColor, UIColor *__autoreleasing *proColor, UIFont *__autoreleasing *titleFont, BOOL *isShowProgressView, BOOL *isOpenStretch, BOOL *isOpenShade) {

    *selColor = [UIColor orangeColor];

    *isOpenShade = YES;
    }];

    这个方法在swift里该怎么写
    RocketsChen:https://www.jianshu.com/p/66b1e78ccddd
  • 夜生物:点击事件在哪里?
  • ddebbd3700b9:pod 'CDDPagerController' 无法使用么?pod search ‘CDDPagerController’ 也搜索不到;是有私有资源么?能给个pod的链接么
    RocketsChen:@灰色天空_3a79 框架正常可供使用,https://cocoapods.org/pods/CDDPagerController
  • 15c7c88fff5d:您好,使用中遇到以下问题:
    1、navigationBar.translucent = NO;时有偏移量
    2、NSArray *titles = @[@"测试01",@"测试02",@"测试03",@"测试04",@"测试05",@"测试06",@"测试07",@"测试08",@"测试09"];
    for (NSInteger i = 0; i < titles.count; i++) {
    UIViewController *vc = [UIViewController new];
    vc.title = titles[i];
    vc.view.backgroundColor = RandColor; //随机色
    [self addChildViewController:vc];
    }
    [self setUpRefreshDisplay]; //刷新
    不显式的在dispatch_async(dispatch_get_main_queue(), ^{

    });
    中执行时标题颜色没有选中效果
    3、 NSLog(@"---%@-----", [NSThread currentThread]);

    NSArray *titles = @[@"测试01",@"测试02",@"测试03",@"测试04",@"测试05",@"测试06",@"测试07",@"测试08",@"测试09"];
    for (NSInteger i = 0; i < titles.count; i++) {
    UIViewController *vc = [UIViewController new];
    vc.title = titles[i];
    vc.view.backgroundColor = RandColor; //随机色
    [self addChildViewController:vc];
    }


    dispatch_async(dispatch_get_main_queue(), ^{

    // NSLog(@"**********%@**********", [NSThread currentThread]);
    [self setUpRefreshDisplay]; //刷新
    });
    时,默认的选中无法复原

    2、3出现均是滑动下部的scrollView,想知道这种情况的原因
    谢谢
    RocketsChen:@七度雨 1、是通过translucent属性改变零点坐标
    2、3和线程执行顺序有关,建议可以先打断点查看下,框架中细节已做处理不会出现重复停留的现象
    如有疑问欢迎Issues
    RocketsChen:@七度雨 已解决
  • 小鱼大苹果:想问下 你的赋值 - (void)setUpDisplayStyle:(void(^)(UIColor **titleScrollViewBgColor,UIColor **norColor,UIColor **selColor,UIColor **proColor,UIFont **titleFont,BOOL *isShowPregressView,BOOL *isOpenStretch,BOOL *isOpenShade))BaseSettingBlock; **这个怎么理解
    RocketsChen:@小鱼大苹果 利用block的回调来设置所需属性。
  • 那夜倚楼听风雨:继承后,属性传值没法用!另外不能刷新页面数据
    RocketsChen:@但愿学以致用 去看下演示demo,需要调用刷新方法
    浪呀么浪打浪:我也遇到属性无法传值,怎么解决
    RocketsChen:@那夜倚楼听风雨 可以,我私信你
  • RocketsChen:最新更新已集成pods 使用方式 在Podfile中加入 pod 'CDDPagerController'即可
    那夜倚楼听风雨:能给个联系方式吗?
  • 王文_bb48:我为什么编译错误呢
    RocketsChen:@王文_bb48 什么?
  • mozzie_0999:麻烦加上自适应文字宽度吧
    RocketsChen:已添加属性,包含默认值,也可自定义。
  • RocketsChen:已更新增加生命周期,并额外增加属性

    [self setUpTopTitleViewAttribute:^(CGFloat *topDistance, CGFloat *titleViewHeight) { //默认topDistance距离顶部的距离 是根据nav判断的,titleViewHeight的默认值为44;
    *topDistance = 100; //标题栏距离顶部的距离
    *titleViewHeight = 100; //标题栏高
    }];
  • iOS白水:生命周期有实现么
    RocketsChen:@超S神 已更新实现生命周期
    RocketsChen:@超S神 说的具体点

本文标题:(iOS)父子控制器

本文链接:https://www.haomeiwen.com/subject/ivtpjxtx.html