简单实现分页滚动效果

有段时间没有更新东西,原因是工作变动,一直没有精力去总结一些东西。最近公司项目中需要用到类似网易新闻滚动的效果,可以先一张效果图,后面在分析实现的过程,这里只是简单的实现了一下效果,没有考虑重用机制的问题,希望大神给个思路。这里是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看下,发现错误希望指正,也希望大神关于重用给我点思路。谢谢!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,746评论 25 709
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,261评论 4 61
  • 深蓝色的天空中,抹过一丝白云,挤出一滴雨滴,奇怪的是此时晴空万里,没有一丁点儿阴暗。 古老的庞大的杉树下,姐姐小环...
    老七吴聿桐阅读 298评论 0 1
  • 今天吃晚饭的时候,旺财的小伙伴们在楼下吆喝着一起去沃尔玛玩耍,旺财咿咿呀呀的很是兴奋,平常吃完晚饭休息一会儿就该上...
    马力教育Molly阅读 271评论 0 1
  • 如果有一天 我变成一只小白鸽 我会不远万里 衔来橄榄枝 让世界不再硝烟弥漫 如果有一天 我变成一株仙人掌 我会迎风...
    我心依然_580a阅读 668评论 102 72