虽然这里说的是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,这个问题暂时没法解决。