简单实现分页滚动效果
2016-03-26 本文已影响601人
改变自己_now
有段时间没有更新东西,原因是工作变动,一直没有精力去总结一些东西。最近公司项目中需要用到类似网易新闻滚动的效果,可以先一张效果图,后面在分析实现的过程,这里只是简单的实现了一下效果,没有考虑重用机制的问题,希望大神给个思路。这里是demo
效果如下:
思路:我把他们分成两个部分,顶部标题部分和下面的滚动视图部分,上面也用一个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看下,发现错误希望指正,也希望大神关于重用给我点思路。谢谢!