本篇教程内的工程资源可以在下面这个地址下载,欢迎转载,谢谢。
http://download.csdn.net/detail/ez_wzr/6364991
使用场景 举例:
应用 使用指南,使用 ios 里的scrollview 来实现分页功能, 通过 如下方法 一个 普遍性的 指南只要几分钟就能批量生产啦。
实现 的核心技术细节:
scrollview的 pagingEnabled 属性,将其设置为YES,并设置其contentSize为一个大于屏幕宽度的值(使其能够滚动)。并将要呈现在scrollview上面的子控件逐步添加到scrollview上。这里因为是分页所以采用了uiviewcontroller的方式。每一页都是一个uiviewcontroller。通过调整对应uiviewcontroller的view的frame的相对位移,来控制对应子view的相对位置。
下面让我们来一步一步看一下实现的过程。
我只使用了uiviewcontroller 上面带有一个页码来实现 具体的detailviewcontroller,可以使用 一些方法来使其具体化,如plist。
构建 detailcontroller:
使用storyboard 制作原型。通过use storyboardid 获取 该 原型并完成初始化。
-(id)initWithPageNum:(int)page{
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Storyboard" bundle:nil];
if((self = [storyboard instantiateViewControllerWithIdentifier:@"detail"])){
pageNum = page;
return self;
}
return nil;
}
初始化 detailcontroller的 代码如下。要注意的一点是 初始化 不能像普通nsobject一样 使用[self init]而是要从storyboard 里 获取 该vicontroller的原型。
页数
int kpageCount = 10;
初始化scrollview,并预先读取前两页(这是为了不出现ui卡滞的情况)
-(void)initScrollView{
controllerArr = [[NSMutableArray alloc] init];
for (int i = 0 ; i < kpageCount; ++i) {
[controllerArr addObject:[NSNull null]];
}
scrollView.pagingEnabled = YES;
scrollView.contentSize = CGSizeMake(scrollView.frame.size.width * kpageCount, scrollView.frame.size.height);
//NSLog(@"%f %f %f %f",scrollView.frame.size.width,scrollView.frame.size.height,scrollView.contentSize.width,scrollView.contentSize.height);
scrollView.showsHorizontalScrollIndicator = NO;
scrollView.showsVerticalScrollIndicator = NO;
scrollView.scrollsToTop = NO;
scrollView.delegate = self;
//pageControl.numberOfPages = kpageCount;
//pageControl.currentPage = 0 ;
[self loadScrollPage:0];
[self loadScrollPage:1];
}
加载scrollview的某页
-(void)loadScrollPage:(int)pageNum{
if(pageNum < 0)return;
if(pageNum >= kpageCount)return;
//NSLog(@"loadpage");
detailViewController *controller = [controllerArr objectAtIndex:pageNum];
if((NSNull*)controller == [NSNull null]){
//NSLog(@"newcontroller");
controller = [[detailViewController alloc] initWithPageNum:pageNum];
[controllerArr replaceObjectAtIndex:pageNum withObject:controller];
}
if(controller.view == nil)NSLog(@"i'm nil");
if(controller.view.superview == nil){
CGRect frame = scrollView.frame;
frame.origin.x = frame.size.width * pageNum;
frame.origin.y = 0;
frame.size = scrollView.frame.size;
controller.view.frame = frame;
//NSLog(@"%f",frame.origin.x);
[scrollView addSubview:controller.view];
}
}
实现scrollviewdelegate的方法
- (void)scrollViewDidScroll:(UIScrollView *)sender{
CGFloat pageWidth = scrollView.frame.size.width;
int page = floor((scrollView.contentOffset.x - pageWidth / 2) / pageWidth) + 1;
NSLog(@"nowpage%d",page);
[self loadScrollPage:page-1];
[self loadScrollPage:page];
[self loadScrollPage:page+1];
CGRect rect = scrollView.frame;
rect.origin.x = page * rect.size.width ;
//scrollView.frame = rect;
//pageControl.currentPage = page;
//NSLog(@"content%f",rect.origin.x);
[self reloadInputViews];
}