美文网首页iOS DeveloperiOS 开发
简单实现分页滚动效果

简单实现分页滚动效果

作者: 改变自己_now | 来源:发表于2016-03-26 16:44 被阅读601次

    有段时间没有更新东西,原因是工作变动,一直没有精力去总结一些东西。最近公司项目中需要用到类似网易新闻滚动的效果,可以先一张效果图,后面在分析实现的过程,这里只是简单的实现了一下效果,没有考虑重用机制的问题,希望大神给个思路。这里是demo
    效果如下:

    yj_demo.gif

    思路:我把他们分成两个部分,顶部标题部分和下面的滚动视图部分,上面也用一个scrollview搞定,下面用scrollview来显示,scrollview中需要加载多个控制器中的view,这两个scrollview则加载一个View上面、

    一、顶部滚动标题的封装

    为了代码的重用,我决定把上面的顶部滚动标题封装一个整块view,该view命名为MNTopTitleBar(名字可以随便取),外界需要的属性就是提供一个标题数组,还有设置标题按钮的宽度,什么字体大小啊,字体颜色啊,我都还写,这里先实现效果,不考虑的那么复杂。就是给我一个数组,我就是创建可以滚动的标题。

    我相信上面的思路很简单,就能实现了,主要贴上多个标题的时候点击标题滚动到合适的位置的代码,其他也没什么难度,有兴趣的可以下载demo看看,希望大家多提意见。

    [UIView animateWithDuration:0.25 animations:^{
        
        self.indexView.centerX = button.centerX;
    }];
    
    //跳转contensize
    
    // 如果数量不够就不需要调整
    if (self.backScrollView.width<self.width) {
        
        return;
    }
    //按钮的中心
    CGFloat centerX = button.centerX;
    //该控件的宽度
    CGFloat scrollViewW = self.width;
    
    CGFloat leftX = centerX - scrollViewW*0.5;
    if (leftX<0) {
        
        leftX = 0;
    }
    
    //计算最右边能滚动最大的距离
    CGFloat maxOffSetX = self.backScrollView.contentSize.width -scrollViewW;
    if (leftX>maxOffSetX) {
        
        leftX = maxOffSetX;
    }
    
    [UIView animateWithDuration:0.25 animations:^{
        
        [self.backScrollView setContentOffset:CGPointMake(leftX, 0)];
    }];
    

    另外这里需要说明,frame的设置,我自己写了UIView的一个分类,这是设置坐标就方便了很多。

    二、创建

    首先看看创建这个view需要的属性

    @interface YJTabPageView : UIView
    /**
     *  子控制器数组
     */
    @property (strong,nonatomic) NSArray *viewControllers;
    /**
     *  所属父类控制
     */
    @property (strong,nonatomic) UIViewControlle*parentViewController;
    
    /**
     * 标题数组
     */
    @property (strong,nonatomic) NSArray *topBarTitles;
    
    @property (copy,nonatomic) void(^pageChageBlock)(    UIViewController *viewController, NSUInteger index);  // 滚动页面发生改变时候的Block
    
    - (void)setPageChageBlock:(void (^)(UIViewController *viewController, NSUInteger index))pageChageBlock;
    
    @end
    

    思路:所有控制器都交给该view的父类控制器来管理,所有的view都添加到下面的scrollview·上面的来显示,监听滚动事件来改变上面标题的状态,上面也是一样。创建代码如下。

     _bottomScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 44, self.width, self.height-44)];
    _bottomScrollView.showsHorizontalScrollIndicator = NO;
    _bottomScrollView.showsVerticalScrollIndicator = NO;
    _bottomScrollView.pagingEnabled = YES;
    _bottomScrollView.delegate = self;
    [self addSubview:_bottomScrollView];
    
    for (int i = 0; i<viewControllers.count; i++) {
        
        YJTestViewController *vc = viewControllers[i];
        vc.view.frame = CGRectMake(i*_bottomScrollView.width, 0, _bottomScrollView.width, _bottomScrollView.height);
        [_bottomScrollView addSubview:vc.view];
        
        [self.parentViewController addChildViewController:vc];
    }
    
    _bottomScrollView.contentSize = CGSizeMake(_bottomScrollView.width*viewControllers.count, _bottomScrollView.height);
    

    另外说明刷一下刷新控制用了第三方的MJRefresh。有兴趣的下载demo看下,发现错误希望指正,也希望大神关于重用给我点思路。谢谢!

    相关文章

      网友评论

        本文标题:简单实现分页滚动效果

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