快速集成App中顶部标题滚动条

作者: 袁峥 | 来源:发表于2015-12-05 16:05 被阅读35612次

    前言

    目前越来越多的App都需要顶部标题切换界面效果,并且带有非常炫酷的效果,利用点时间给广大的攻城狮们提供了这样一个框架,集成了当前比较主流的几种效果,网易新闻(字体缩放+颜色渐变),今日头条(颜色填充),喜马拉雅,糗事百科(下标),腾讯视频(蒙版)等。如果喜欢我的文章,可以关注我微博:袁峥Seemygo

    Demo简介:

    • 只要修改storyboard中,导航控制器根控制器的类型,就能看到不同的效果。
    Demo简介.png

    框架使用教程:

    • 用法跟UITabBarController一样,完全模仿UITabBarController写的,只要把YZDisplayViewController拖入自己工程即可。
    • 1.自定义控制器继承YZDisplayViewController
    • 2.在viewDidLoad中添加标题对应的控制器,并且把标题保存到对应控制器。
    • 3.设置想要的标题效果,具体查看YZDisplayViewController.h文件,有哪些效果。
    • 4.使用注意:如果需要全屏显示,并且添加的子控制器是tableViewController,当有导航控制器或者UITabBarController,需要设置tableView额外滚动区域,详情请看FullChildViewController

    实例程序:

    1.网易新闻:YZWYViewController

    网易新闻.gif
    • 1.继承YZDisplayViewController
    @interface YZWYViewController : YZDisplayViewController
    
    @end
    
    
    
    • 2.在viewDidLoad中添加标题对应的控制器,并且把标题保存到对应控制器。
    @implementation YZWYViewController
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        
        // 添加所有子控制器
        [self setUpAllViewController];
        
    }
    
    @end
    
    • 3.设置想要的标题效果,具体查看YZDisplayViewController.h文件,有哪些效果。
        // 标题渐变
        // *推荐方式(设置标题渐变)
        [self setUpTitleGradient:^(YZTitleColorGradientStyle *titleColorGradientStyle, UIColor *__autoreleasing *norColor, UIColor *__autoreleasing *selColor) {
            
        }];
        
        // 字体缩放
        // 推荐方式 (设置字体缩放)
        [self setUpTitleScale:^(CGFloat *titleScale) {
            // 字体缩放比例
            *titleScale = 1.3;
        }];
    
    
    

    2.今日头条:YZJRViewController

    今日头条标题渐变.gif
    • 1.继承YZDisplayViewController
    @interface YZJRViewController : YZDisplayViewController
    
    @end
    
    
    • 2.在viewDidLoad中添加标题对应的控制器,并且把标题保存到对应控制器。
    @implementation YZJRViewController
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        
        // 添加所有子控制器
        [self setUpAllViewController];
        
    }
    
    @end
    
    • 3.设置想要的标题效果,具体查看YZDisplayViewController.h文件,有哪些效果。
         // 模仿网络延迟,0.2秒后,才知道有多少标题
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        
            // 移除之前所有子控制器
            [self.childViewControllers makeObjectsPerformSelector:@selector(removeFromParentViewController)];
            
            // 把对应标题保存到控制器中,并且成为子控制器,才能刷新
            // 添加所有新的子控制器
            [self setUpAllViewController];
            
            // 注意:必须先确定子控制器
            [self refreshDisplay];
            
        });
        
        /*  设置标题渐变:标题填充模式 */
        [self setUpTitleGradient:^(YZTitleColorGradientStyle *titleColorGradientStyle, UIColor *__autoreleasing *norColor, UIColor *__autoreleasing *selColor) {
            // 标题填充模式
            *titleColorGradientStyle = YZTitleColorGradientStyleFill;
        }];
    
    

    3.喜马拉雅:YZXiMaViewController

    喜马拉雅全屏展示.gif
    • 1.继承YZDisplayViewController
    @interface YZXiMaViewController : YZDisplayViewController
    
    @end
    
    
    • 2.在viewDidLoad中添加标题对应的控制器,并且把标题保存到对应控制器。
    @implementation YZXiMaViewController
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        
        // 添加所有子控制器
        [self setUpAllViewController];
        
    }
    @end
    
    • 3.设置想要的标题效果,具体查看YZDisplayViewController.h文件,有哪些效果。
          // 设置标题字体
        // 推荐方式
        [self setUpTitleEffect:^(UIColor *__autoreleasing *titleScrollViewColor, UIColor *__autoreleasing *norColor, UIColor *__autoreleasing *selColor, UIFont *__autoreleasing *titleFont, CGFloat *titleHeight) {
            
                // 设置标题字体
                *titleFont = [UIFont systemFontOfSize:20];
            
        }];
     
        // 推荐方式(设置下标)
        [self setUpUnderLineEffect:^(BOOL *isUnderLineDelayScroll, CGFloat *underLineH, UIColor *__autoreleasing *underLineColor) {
            // 标题填充模式
            *underLineColor = [UIColor redColor];
        }];
        
        // 设置全屏显示
        // 如果有导航控制器或者tabBarController,需要设置tableView额外滚动区域,详情请看FullChildViewController
        self.isfullScreen = YES;
    
    • 4.如果添加的子控制器是tableViewController,给tableView设置底部显示区域
    @implementation FullChildViewController
    - (void)viewDidLoad
    {
        [super viewDidLoad];
    // 如果有导航控制器,顶部需要添加额外滚动区域
      // 添加额外滚动区域   导航条高度 + 标题高度
    
        if (self.navigationController) {
    
            CGFloat navBarH = self.navigationController.navigationBar.bounds.size.height;
    
            // 查看自己标题滚动视图设置的高度,我这里设置为44
    
            CGFloat titleScrollViewH = 44;
    
            self.tableView.contentInset = UIEdgeInsetsMake(navBarH + titleScrollViewH, 0, 0, 0);
    
        }
        
        // 如果有tabBarController,底部需要添加额外滚动区域
    //    self.tableView.contentInset = UIEdgeInsetsMake(64 + 44, 0, 49, 0);
    }
    @end
    

    4.腾讯视频:YZTXViewController

    腾讯视频.gif
    • 1.继承YZDisplayViewController
    @interface YZTXViewController : YZDisplayViewController
    
    @end
    
    
    • 2.在viewDidLoad中添加标题对应的控制器,并且把标题保存到对应控制器。
    @implementation YZTXViewController
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        
        // 添加所有子控制器
        [self setUpAllViewController];
        
    }
    @end
    
    • 3.设置想要的标题效果,具体查看YZDisplayViewController.h文件,有哪些效果。
        CGFloat y = self.navigationController?64:0;
        CGFloat screenW = [UIScreen mainScreen].bounds.size.width;
        CGFloat screenH = [UIScreen mainScreen].bounds.size.height;
        
        // 设置搜索框
        CGFloat searchH = 44;
        UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, y, screenW, searchH)];
        [self.view addSubview:searchBar];
         // 设置整体内容尺寸(包含标题滚动视图和底部内容滚动视图)
        [self setUpContentViewFrame:^(UIView *contentView) {
           
            CGFloat contentX = 0;
            
            CGFloat contentY = CGRectGetMaxY(searchBar.frame);
            
            CGFloat contentH = screenH - contentY;
    
            contentView.frame = CGRectMake(contentX, contentY, screenW, contentH);
            
        }];
        
        /****** 标题渐变 ******/
        // 推荐方式(设置标题颜色渐变) // 默认RGB样式
        [self setUpTitleGradient:^(YZTitleColorGradientStyle *titleColorGradientStyle, UIColor *__autoreleasing *norColor, UIColor *__autoreleasing *selColor) {
            *norColor = [UIColor greenColor];
            *selColor = [UIColor redColor];
        }];
    
        /****** 设置遮盖 ******/
        // *推荐方式(设置遮盖)
        [self setUpCoverEffect:^(UIColor **coverColor, CGFloat *coverCornerRadius) {
            
            // 设置蒙版颜色
            *coverColor = [UIColor colorWithWhite:0.7 alpha:0.4];
            
            // 设置蒙版圆角半径
            *coverCornerRadius = 13;
        }];
    

    源码

    点击这下载源代码

    相关文章

      网友评论

      • 我还只是个孩子啊:iOS 12 bate版,导航默认显示的背景变黑了,不知道是不是测试版的原因
        dc96918179b9:删除YZDisplayTitleLabel.m文件下 UIRectFillUsingBlendMode(rect, kCGBlendModeSourceIn); 即可解决背景变黑。
      • ba482b7fcc0b:用了最新的代码,在处理网络数据的时候 每次滑动 viewDidLayoutSubviews这个方法调用的次数跟添加的子控制器的数量一样多 请问下这个怎么处理比较好呢? 而且第一次进来的时候 不会调用viewWillAppear方法 在实际请求数据的时候有点麻烦
        6a40e57ba3d0:兄弟这个问题解决没有?碰到了一样的问题,求解决方法!
      • 305365d2b980:峥哥 这个和wkWebView一块使用 pop就崩溃了 这个咋回事啊?
      • 微小的沙土:刚进入应用,滑动结束 懒加载controller,第一个界面太久才响应,也就是整个界面都出来半天了,才出来顶部标题和内容,怎么解决
      • 雨洒潇湘:iPhoneX怎么适配呀
      • 蒛德僦媞埘尙:我想把title的 问题换成图片 怎么搞
      • 心语风尚:不能一个控制器 复用吗
      • me_shane:有遇到UILabel添加点击事件不生效的吗
        ps:我在自己的工程中YZDisplayTitleLabel.h的点击不生效
      • CoderSJun:请问崢哥
        __autoreleasing *什么时候使用做修饰呀
        有些变量有这个 有些变量没有
      • 珂兰钻石:我的网络请求是这样写的:
        珂兰钻石:滚动完成的时候发通知就不先走我的Fetcher了,怎么办大佬,急,谢谢!
        珂兰钻石:- (void)viewDidLoad {
        //网络请求数据
        ArticleSciencePageFetcher *fetcher = [[ArticleSciencePageFetcher alloc] init];
        fetcher.index = self.tid;
        _dataFetcher = fetcher;
        [super viewDidLoad];

        [self setupUI];
        [self setupLayout];
        [self setupSearch];
        }
      • 珂兰钻石:峥哥,我想滑动完成的时候才去加载控制器,请问怎么整,现在是我一开始滑动就把所有的控制器都加上了,因为数据请求有延迟会卡。能帮帮我吗?
      • Wuyd2019:@袁峥 你好,这个可以在滚动条右侧或者左侧添加其他按钮吗?比如今日头条或者网易新闻右侧都有一个“➕”号
        蕤絮:同学你这个解决了吗?能给我一些参考吗?
      • 8789df3144a8:如果我想把列表放在底部 而viewcontroller。view 放在上面 可以实现吧。
      • wq04200:如果子控制器加入mjrefresh上拉加载,加载成功后,子控制器的tableView会莫名其妙滑动到中间的位置,并不处于最底端这种情况遇到过么 ==
      • 沐然回首:峥哥,iPhone X的适配你可以更新下了:grin:
      • Blz:可以初始化 选中位置吗?
      • 2a7f6a07ea37:HI,啊峥 看了下你的源码 用collectionview 显示子控制器的view ,我自己模拟了一下, 发下我添加的子控制器在collectionview上显示第一个控制器View 时,它的 viewWillApear 不会被调用, 求解,困扰好久了 ,这是怎么回事呢? 代码如下
        - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
        return self.childViewControllers.count;
        }
        - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
        CNCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"CNCollectionViewCell" forIndexPath:indexPath];
        cell.title.text = @(indexPath.item).stringValue;
        [cell.contentView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
        UIViewController *vc = self.childViewControllers[indexPath.item];
        vc.view.frame = CGRectMake(0, 0, kScreenWidth, 400);
        [cell.contentView addSubview:vc.view];
        return cell;
        }
      • XTK_iOS:崢哥,有没有支持图片+文字的滑动切换呢?
      • 家丁三锅:大佬,请问下 怎么把标题 放在 导航栏上面?
      • 笨小孩_松:请问崢哥, 第一次进来默认选中对应的ChildViewController里的loadData会走两次?
      • 沫若清风:子控制器是collection view时坐标不对啊??
      • 西风颂:请问那个通知第一次进入的时候为什么会发两次通知呢?能不能不让其发送两次通知呢?
      • pentakill:存在一个问题,当你进行今日头条那样的标签管理,开始是2个字的标题比如“热点”,你增加一个标签变成@“环球视野”,那样的话。就会显示不下,然后标题就是省略号
        elite_kai:是不是放在tabbarcontroller中的时候?我现在这边也遇到了,初始化的时候加载几个子控制器,然后通过修改性别,替换几个子控制器的title,结果就出现省略号了
      • 7c519298f6cb:我想问一下当只有一个控制器时怎么让标题不居中而是居左显示啊
      • KevinChein:@峥吖 @袁峥Seemygo 当从第一个标题点击切换到第二个标题的时候underLine没有动画效果,中间标题在滚动的时候underLine是抖动的,是不是宽度值切换的频率比较高?
      • KevinChein:@峥吖@袁峥Seemygo 峥哥,发现一个小bug,我设置了两个子控制器,从第二个控制器滑动返回第一个子控制器的时候underLine的长度是先短(<0.5*ScreenWidth)后动态变长(=0.5*ScreenWidth), 点击切换的时候是正常的
      • 冷了年度:你好 我感觉有一点你可以补充,关于 selectIndex 这个属性,当滚动的时候,这个属性的值应该实时更改,例如,滚动到了第3个位置时这个值为2,(因为值是从0开始的)。和偏移量进行维护。这是我的建议。因为当我滚动到某个地方的时候,我不知道我滚动到哪里了。
      • pentakill:楼主,我遇到一个问题。我使用这个界面的时候先判断本地是否有这些顶部的标签,没有就去服务器获取,保存到本地,然后去添加子控制器,可是界面不会出来。当我第二次进去的时候从本地获取了标签数组然后界面就加载出来了,这是什么原因啊,而且我还试了获取数据之后回到主线程刷新添加子控制器还是不起作用。。
      • eac6ebd56d25:@峥吖 峥哥, 这个框架很好用, 但是我遇到了点问题...
        1.设置了titleScrollViewColor为白色为什么还是默认的半透明?
        2.使用它创建子控制器默认会创建两次titleLabel, 于是最后把ViewWillAppear中那句[self setUpAllTitle];干掉了,请问会导致什么问题吗..
      • August24:swift 用 里面的block 传值怎么写?
      • Moshimol:怎么修改title的值呢 在试图即将出现的时候
      • 65b88cd256bc:大神,好像不能更改滚动条的高度和背景色啊
      • uncleRX: 您好 ,继承YZDisplayViewController ,之后 切换子控制器,self.selectIndex, 打印永远是0
      • 李响2022:手势好像跟手势返回有冲突,请问,怎么才能手势返回呢?
        李响2022:@远爸_8f8c http://www.chaoshenglu.com/2017/02/27/20170227/
        远爸_8f8c:@李响2015 大哥,这个怎么解决的,可以分享下吗
        李响2022:嘿嘿,我已经自己找到方法了。使用FDFullscreenPopGesture。不过得新建一个UICollectionView的子类,然后重写gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer方法。
      • cdbc22419bfc:有bug,点击某个VC,然后pop回来的时候,不是返回原来的VC,而是返回到最中间的VC
      • Leon_520:支持
      • Big_Zheng:你好,如果tableview左滑删除的时候会有冲突,这个怎么解决
      • XTK_iOS:你好,我在界面滑动的时候,当我滑动到第二个界面的时候,第三个页面也会加载,这个怎么判断或者解决呢?
      • 会疼的白痴:可以做到滑动超过一半在加载数据呢?现在是第二个界面滑动一点就加载数据了
      • 8c44b81eef9b:峥哥,好像有一个小缺陷。就是手动滑动内容区,到下一个控制器的时候,下下一个控制器可能会提前加载,我看你的源码是把控制器的加载写到了- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath方法里,可能是collectionview会提前生成下一个cell导致的。
        我现在的做法是,把上面那个方法的添加控制器view的代码,转移到- (void)collectionView:(UICollectionView *)collectionView willDisplayCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath方法里面,这样就解决了上面描述的问题,但不知这样改好不好,目前还没有发现,望峥哥指点。
        6a40e57ba3d0:@iOS1994 116楼兄弟的解决方法是可行的 ,不知道兄弟有没有更好的解决方法?
        XTK_iOS:我也遇到了你说的问题,我的也是在滑动到第二个界面的时候会把 下个界面也加载了,但是以后的界面就不会了,你是怎么去解决这个问题的呢?
      • ab4efef193d5:阿峥老师:您使用了UIView+Frame的分类,我的项目中也有这个分类,这样如果直接将YZDisplayViewController拖进工程会覆盖掉自己的分类的,UIView+Frame:这个分类的名字起的是好,很容易起重名,所以建议老师加上您的前缀YZ,例如:UIView+YZFrame, 正在研究您的框架,不止达到会用,还要看懂框架
      • xuzhenhao:你好,我在集成时,滚动条和navigationBar之间有间隙,请问是什么原因?
      • ebb6438db624:峥老师你好,我用您的滚动条框架,设置了每个子VC的Tag,发现滑动切换Tag值会乱,希望您指点
      • C丶丶H:袁哥,想请问下继承你写的这个控制器,不是应该先走父类的方法吗? 那父类如何获取ChildViewController的?
      • _Rico_:铮哥,设置了self.tableView.contentInset怎么没有效果呢?
        _Rico_:isfullScreen = YES 的情况下
      • b6a10bade300:titleScrollViewColor 是不是设置 无效,解决了吗? :smile:
      • 清晰00:请问如何实现循环滑到? 第一页可以调最后一页,最后一页可以滑到第一页 ?
      • 断风刀:为什么喜马拉雅的只要设置两个参数就能产生随机颜色
      • e5fb1e513efd:用这个框架每一个 title 对应一个控制器 不走- (void)viewWillAppear:(BOOL)animated{};这个方法 想要每次视图出现的时候就刷新页面怎么解决啊
        49118c8b5ff1:@袁峥Seemygo 真的有的标题下的控制器不会走viewWillAppear方法,这个大bug很头痛,解决很长时间没搞出来,希望峥哥瞧瞧啊
        袁峥:@爱吃土豆的程序媛 应该会调用的吖
      • CoderJyq:峥哥,请教一个问题,setUpTitleGradient方法在swift中如何设置标题颜色?
        转换为swift后是这样的:
        setUpTitleGradient { (titleColorStyle : UnsafeMutablePointer<YZTitleColorGradientStyle>?, norColor : AutoreleasingUnsafeMutablePointer<UIColor?>?, selColor : AutoreleasingUnsafeMutablePointer<UIColor?>?) in
        norColor = UIColor.black
        selColor = UIColor.orange
        }
        }
        此处报错:不能修改norColor和selColor,因为他们是let变量
        刘大帅:哦,查到了,用pointee,如norColor.pointee = UIColor.black
        刘大帅:兄弟,swift的问题解决了么?
      • 遛遛食:我使用这个框架出现点击头部文字无效,这是为什么啊?有导航栏
        遛遛食:- (void)viewDidLoad {
        [super viewDidLoad];
        self.view.backgroundColor = [UIColor whiteColor];
        self.title = @"订单";

        [self setUpAllViewController];
        }

        -(void)setUpAllViewController
        {
        AllViewController *allVC = [[AllViewController alloc]init];
        allVC.title = @"全部";
        [self addChildViewController:allVC];

        PayViewController *payVC = [[PayViewController alloc]init];
        payVC.title = @"待付款";
        [self addChildViewController:payVC];

        ReceiptViewController *receiptVC = [[ReceiptViewController alloc]init];
        receiptVC.title = @"待收货";
        [self addChildViewController:receiptVC];

        SunOrdViewController *sunOrdVC = [[SunOrdViewController alloc]init];
        sunOrdVC.title = @"可晒单";
        [self addChildViewController:sunOrdVC];

        // 设置标题字体
        // 推荐方式
        [self setUpTitleEffect:^(UIColor *__autoreleasing *titleScrollViewColor, UIColor *__autoreleasing *norColor, UIColor *__autoreleasing *selColor, UIFont *__autoreleasing *titleFont, CGFloat *titleHeight,CGFloat *titleWidth) {
        *norColor = [UIColor colorWithHexString:@"999999"];
        *selColor = [UIColor colorWithHexString:@"ff4200"];
        *titleFont = [UIFont systemFontOfSize:17];

        }];

        // 推荐方式(设置下标)
        [self setUpUnderLineEffect:^(BOOL *isUnderLineDelayScroll, CGFloat *underLineH, UIColor *__autoreleasing *underLineColor,BOOL *isUnderLineEqualTitleWidth) {
        // 标题填充模式
        *underLineColor = [UIColor colorWithHexString:@"ff4200"];
        }];

        [self setUpContentViewFrame:^(UIView *contentView) {
        contentView.frame = CGRectMake(0, 64, kScreenW, kScreenH);
        }];
        }
        遛遛食:@袁峥Seemygo 嗯嗯,是的
        袁峥:@遛遛食 无效?
      • 2ede4a8a7da0:楼主大神:怎么设置滚动标题的颜色呀?
        袁峥:@Mr_hao norcolor
      • 会疼的白痴:峥哥,位置的里面是UITablewView,可是感觉有20像素滑动不了呢,就是cell始终有20像素左右加载不出来
      • 高压玩笑:为啥我报了21个错
      • ad5612db7b1c:你好 ,我怎么在标题栏最右侧添加个自定义按钮?
        袁峥:@ad5612db7b1c 添加子控制器
      • 763286777db0:添加子控制器滑动 造成内存泄漏。今日头条去掉0.2的延时,滑动栏出错
      • 遛遛食:我用你的这个框架崩在
        // 选中标题
        [self selectLabel:self.titleLabels[i]];
        错误提示
        Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 1 beyond bounds for empty array'

        我的QQ:2450862074可否私聊解决一下
      • 逆天为我:怎么解决,楼主
      • 逆天为我:我刚刚试了一下,点击一下,或者滑动一下,接收这个YZDisplayViewClickOrScrollDidFinshNote通知,打印三次,如果网络请求,请求三次,那还不出错
        袁峥:@逆天为我 对 最好不要在这请求
      • _Shj:你好,我用这个来实现多标题,最右边的标题距离右边太近了 能改的靠左边吗
        袁峥:@_Shj 可以 你修改下margin
      • _Shj:你好 我想重用控制器只用点击不同标题的时候传入不同的参数 ,控制器的样式都一样 里面的cell 表格都是一样的 只是不同数据而已 这样没必要建好多控制器,请问有相应的代理方法啥的吗/

        清晰00:请问有没有在导航栏上居中的样式?
        _Shj:@峥吖 好的 谢谢啦
        袁峥:@_Shj 这个不行喔 一个控制器对应一个界面
      • 袁峥:当前框架,不支持自定义标题view,标题宽度也不能自定义,默认跟随字体一样宽,因为要做今日头条效果
      • 袁峥:当前框架 不支持导航条显示标题,没碰见过这种需求,不知道什么效果,如果有这个需求,可以把原型图发我看看
      • 袁峥:当前框架已经做了离屏渲染和控制器view懒加载
      • boyka_yang:在线等 头视图我想加载封装好的一个titleview 然并卵 求破
        袁峥:@2b834b74e3e9 这个不行喔 如果你自定义标题 就没有我标题的效果了
      • black1997:这个框架没有修改默认选中第几个标题的方法耶???
        袁峥:@black1997 有
      • CholMay:每个页面增加一个子控制器 像今日头条最多近50个频道,不能能一下创建这个多控制器吧,应该在主控制器中添加两个或三个tableView,类似轮播图的效果,循环利用才是@啊峥
        袁峥:@草莓傻蛋 做了离屏渲染,view做不了优化,控制器一直在 就不会销毁
      • RanGang:能不能字体放大效果和角标可以同时使用呢,我想要那个效果。
        袁峥:@RanGang 这个不好控制喔 因为字体太大 会导致下标不好看
      • c6b273e1d47d:您好 我集成之后为什么 scrollview中的title不显示
      • 3b668e481eb8:如果是假数据的没问题。假数据如果加上延迟加载,也是数据不显示,求助
      • 3b668e481eb8:峥老师,我用的您的发现,如果标题是从网络上获取的话,标题什么都不显示,这个咋办啊
        袁峥:@xyzz 有子控制器吗
      • TommyYaphetS:LZ,我试试了,您这个方法 - (UIScrollView *)contentScrollView 估计是跟私有的api重名了....
        TommyYaphetS:@jasonxia 是的,只能说,"程序员最难的果然是取名",^_^
        jasonxia:@TommyYaphetS 我也这么认为,如果在 UIViewController 的 subclass 中增加 - (UIScrollView *)contentScrollView 方法,它先于 viewDidLoad 被调用。
      • TommyYaphetS:您好,我写了一个类XxxViewController继承YZDisplayViewController,想不明白,为什么YZDisplayViewController的contentScrollView方法反而会比contentScrollView的viewDidLoad方法先执行,看了好久始终没找到原因.......
        袁峥:@TommyYaphetS 我内部会自动调用
      • hello_kity:早就想找个这样的demo 多谢阿铮老师
      • Qinz:#import "MainVC.h"
        #import "SubVC.h"


        @interface MainVC ()

        @property (nonatomic, strong) NSMutableArray *titleArrM;


        @EnD

        @Implementation MainVC

        - (void)viewDidLoad {
        [super viewDidLoad];

        self.titleArrM = [[NSMutableArray alloc]initWithArray:@[@"全部",@"待付款",@"待发货",@"待收货"]];

        [self setUpAllViewController];


        }

        - (void)setUpAllViewController
        {
        UIStoryboard*mainStrorybodard=[UIStoryboard storyboardWithName:@"Main" bundle:nil];

        for (NSInteger i=0; i<self.titleArrM.count; i++) {
        SubVC*subVc=[mainStrorybodard instantiateViewControllerWithIdentifier:@"SubVC"];
        subVc.title=self.titleArrM[i];

        [self addChildViewController:subVc];
        }

        //调用该方法后会创建8个子控制器,需要改啊!
        // [self refreshDisplay];

        }
        苏神速:找到原因了 refreshdispaly 中会调用setUpAllTitle 然后viewwillappear也会调用 因此创建了两遍标题。 并不是两倍的controller 只要在 setUpAllTitle 调用 [self.titleLabels makeObjectsPerformSelector:@selector(removeFromSuperview)];
        [self.titleLabels removeAllObjects];
        暂时可解决
        苏神速:@曰天大肾 解决了吗兄弟
        eac6ebd56d25:兄弟,解决了吗?
      • VanChan:建议预留出当前选择哪个标题的接口, 还有我发现设置标题滚动视图的阴影设置不了, 不知道是为什么
      • 44c1626225db:楼主,如果我想把titleScrollview 添加在NavBar上,我的想法是,直接更改titleScrollview的Frame的其所添加的视图,这个方法可能么 ?
        袁峥:@忧愁长白山 导航条没做
        44c1626225db:@忧愁长白山 或者说 我如何可以在子类来修改YZDisplayViewController这个类中titleScrollview的样式。
      • 6e22a1787f6c:有一个同事用了这个感觉问题挺多的,感觉继承这个点就有点不解耦
        袁峥:@骷髅会编程 问题有待改进,只要使用别人东西,就少不了耦合
      • wahyx98:能不能多一个 "把标题滚动栏 集成在 导航栏"上的选项
      • 在没老之前:峥哥,我是用一个ViewController来继承的,然后添加了两个tableViewController。使用的是网易渐变文字的。打开模拟器,很正常,可以滑动,可以点击。但是有个问题是当我在这个界面退到后台来时,再进去,控制台会报很多警告,而且tableView的位置也发生了变化
      • 在没老之前:峥哥,子控制器是tableView,显示的时候会有一点问题。怎么设置啊
      • 未来的自己在哪里:我想点击cell的时候设置子标题,但是不行。- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
        UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
        NSString *newTitle = cell.textLabel.text;
        self.title = newTitle;
        }
      • 横爬介士:测试机5S,系统9.2.1
      • 横爬介士:使用模拟器的话,四个都可以完美运行,但是使用真机的时候发现前三个都会导致项目崩溃,只有喜马拉雅可以正常使用
      • 5bd9188b8712:如果控制器的标题数据时从服务器获取的 你这个标题就不行显示了 这个是bug吗?
      • f6332fcb6876:老师,如果标题栏那里标签很多的话,比如有30多个,那么标题栏容器scrollView改成collectionView是不是好点
        f6332fcb6876:@峥吖 :sweat:老师这反射弧好长
        袁峥:@SB肚 嗯嗯
      • Super_Yi:阿崢老师,集成了你的框架,为什么点击标题的按钮左边的按钮不会缩小,而滑动下面的内容页面可以缩小?
        袁峥:@Berton_Yi 点击的时候 不做处理
      • LoyalToOrigin:请问下,如果手动设置selectIndex = 7,标题label是在屏幕外的,怎样让现实标题的scrollView偏移,我获取到scrollView对象,设置contentOffset,好像并没有效果.
      • sclcoder:楼主,顶部title渐变的样式为YZTitleColorGradientStyleFill时 是用重绘的方式实现的。这样的实现效率应该不太好吧。有没有考虑使用masklayer的方式实现呢?
      • b6e9b9ef9d32:大神 这个好像不能指定跳转哪个子控制器?有什么解决的方法么
        b6e9b9ef9d32:@峥吖
        b6e9b9ef9d32:@峥吖 能回复下么😊
      • B_C_H:你好,在真机测试时. demo 中只有"喜马拉雅"运行正常,其他模块报错:Could not load the "1" image referenced from a nib in the bundle with identifier "iThinker.YZDi"
        横爬介士:@sclcoder 现在最新的代码图片是png格式的,但是还是报错

        sclcoder:@baichenghui 那个图片不是png格式 应该是被改成了png
      • ffd770516fe4:崢哥,如果滑动到最后一个视图控制器,再滑动的时候,让他可以回到第一个视图控制器,怎么弄,我改了大半天,不知道咋改,求崢哥指教
      • 我就叫Sunny不改了:为什么其他页面调用对象方法修改角标不管用啊,
        YZDisplayViewController *controll = [[YZDisplayViewController alloc]init];
        controll.selectIndex = 3;
        怎么才能修改页面?
      • 35d3bce9eb69:阿崢老师, 我将继承了YZDisplayViewController的类叫xxxxView,并将xxxxView嵌套到另一个uiviewcontroller中,不知道为什么xxxxView内的子view与屏幕顶部大概有10的间隔,但直接显示继承了YZDisplayViewController的类没有问题
      • 8b6d72637a1f:阿峥老师,就是牛掰。。。 :+1: :+1: :+1:
      • f72825264422:很不错啊!有一个地方YZDisplayViewController.m 654行BOOL应该改成NSInteger,改成- (void)setSelectIndex:(NSInteger)selectIndex,不然设置默认选中无效
      • __下一个天亮__:好棒好棒!!!
      • liujieyuu:底部的下标线的长度能定制嘛?想均分长度
      • lyan:请问在滑动的子viewController中,有地图控件,在拖动地图的时候变成了子viewController的切换了,要怎么设置当滑动地图的时候只接受地图的滑动
        lyan:@峥吖 问题已解决了 子控制器的view上有地图或子控制器的cell中有地图,确实存在地图拖不动的情况,加了个属性记录当前的子控制器,现在展示的子控制器还有地图时将scrollEnabled = NO;就可以了
        袁峥:@lyan 应该第一响应者是地图吧

      本文标题:快速集成App中顶部标题滚动条

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