iOS DeveloperiOS 开发

简单实现分页滚动效果

2016-03-26  本文已影响601人  改变自己_now

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

上一篇下一篇

猜你喜欢

热点阅读