[ios前端开发笔记]使用scrollView进行分页

本篇教程内的工程资源可以在下面这个地址下载,欢迎转载,谢谢。

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];
}


你可能感兴趣的:(ios开发笔记)