实现UIScrollView的分页

虽然这里说的是scrollView,但对于tableView和collectionView都适用。


1. 添加一个UIPageControl,设置当前页和总页数。

self.pageControl.currentPage =0;

self.pageControl.numberOfPages =2;

总页数不固定的,自己计算,很easy了。


给PageControl添加UIControlEventValueChanged的事件:

 [self.pageControladdTarget:selfaction:@selector(pager_ValueChanged:)forControlEvents:UIControlEventValueChanged];

实现pager_ValueChanged:

- (void)pager_ValueChanged {

   // Update the scroll view to the appropriate page

    CGRect frame;

    frame.origin.x =self.scrollView.frame.size.width *self.pageControl.currentPage;

    frame.origin.y =0;

    frame.size =self.scrollView.frame.size;

    [self.scrollViewscrollRectToVisible:frame animated:YES];

}

这个pager_ValueChanged主要工作就是同步scrollView。


2.设置scrollView

设置pagingenbaled = yes。

这个主要是控制scroll会翻过一整夜,而不是半页或其他。


实现uiscrollviewdelegate的scrollViewDidScroll

- (void)scrollViewDidScroll:(UIScrollView *)sender {

   CGFloat pageWidth =self.scrollView.frame.size.width;

   int page =floor((self.scrollView.contentOffset.x - pageWidth /2) / pageWidth) + 1;

   self.pageControl.currentPage = page;

}

主要是为了同步pageControl。

这样就基本实现完毕,但这里有个问题。假设数据源有五个元素(A,B,C,D,E),每页显示四个,那么第二页就一个元素。翻页或者滑动的时候会这样:

第一页:A,B,C,D。当翻到第二页,第二页为:B,C,D,E。

看起来还不错。但当单击到scrollview上后,scrollview会自动滑动到第一个。原因是没设置contentsize。

将contentsize的width设置为一页的宽度,heigh设置为scrollview的hiegh(如果确实是的话)。这样上面的问题就不存在了。


但又出现新的问题,翻到第二页时,第二页就只有一个元素(E),还是居左的,非常难看。

这个问题没能很好的解决。想通过设置边距解决,但边距在第一页的时候就设置好了,无法搞定。

后来想了一个办法就是修改元素E的坐标,通过计算找到中间位置,可以很好的将最后一个的元素剧中。


如果这个scrollView只是为了展示用,没有任何交互行为这样就ok了。

如果有交互行为这个方法就失败了,tap最后一页的元素时为了确定某个元素,需要取得坐标,使用取得的坐标去确定tap的是那个view,这时候就出错了。tap的是元素E,通过坐标却定位不到元素E,这个问题暂时没法解决。






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值