【IOS】使用UIScrollView 实现page页效果

ios的UIScrollView的确实现比较棒,流畅的滑动和换页时的缓动很赞。但是在研究ScrollView的Paging Mode时,发现要想做到多页显示时,只保留3页的View还是要自己做些事情的。

Paging Mode,官方的Programming Guide里面有一个例子:
https://developer.apple.com/library/ios/#samplecode/PageControl/Listings/ReadMe_txt.html

本文也是在这个基础上改的。这个例子主要思路是,每一页单独使用一个ViewController, 然后把这个ViewController的view添加到ScrollView里,设置该页的frame。但是例子里面是把每页的controller添加到viewControllers里面,虽然做到了每页的view的load是on demand的,但是没有释放看不见的页。

那么假设我们只保留当前页,前页以及后页的话,可以这么做

1 保存5页的controller,循环使用
viewControllers = [NSMutableArray alloc] initWithCapacity:5];
for (int i = 0; i < 5; i++) {
[viewControllers addObject:[NSNull null]; //初始化为null
}

2 load page时,取模得到真正用的controller
– (void)loadScrollViewWithPage:(int)page{

int actualPage = page % 5;
MyViewController *controller = [viewControllers objectAtIndex:actualPage];

}

3 在适当的时候释放不用的页
判断该不该释放
– (BOOL)needUnload:(int)index{
int now = page_ % 5
if (now == 4 && index == 0){
return NO;
}
if (now == 0 && index == 4){
return NO;
}
return ABS(index – now) > 1;
}
我是在滑动结束时做这个操作
– (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{

MyViewController *c = nil;
for (int i = 0; i < 5; i++){
c = [viewControllers objectAtIndex:i];
if ([self needUnload:i] && (NSNull *)c != [NSNull null]){
[viewControllers replaceObjectAtIndex:i withObject:[NSNull null];
}
}

}
因为replace的时候会release对应的controller,然后就会dealloc了。

那么这种方案比直接使用3个view做为page, 然后动态改view的frame有什么区别呢?

3个view的方案, 当view里面的子view如果需要异步加载图片之类的需求的话,因为load page是在滑动的函数scrollViewDidScroll, 会有重复加载的问题。不知道怎么解决。如果有同学知道的话,还请赐教。

而上面的基于controller的方案不会有这个问题, 但是有新生成和销毁controller的问题。其实这个实现比较像android的adapter的思路。:)

豆瓣猜的样式 ,使用里上面的pager实现。
豆瓣猜的样式 ,使用里上面的pager实现。

发表评论

电子邮件地址不会被公开。 必填项已用*标注