获取当前页面
在我的滚动视图中,我想获取正在显示的当前页面(也许页面不是正确的术语)。 我找不到任何variables,持有这个。 但我认为它必须在某个地方,因为指标能够显示当前正在显示的滚动视图的哪个子视图。
这是完全隐藏的,还是有我的方式访问它?
当前页面没有UIScrollView
属性。 你可以用下面的方法计算
int page = scrollView.contentOffset.x / scrollView.frame.size.width;
如果您想要四舍五入到最近的页面,请使用:
CGFloat width = scrollView.frame.size.width; NSInteger page = (scrollView.contentOffset.x + (0.5f * width)) / width;
我很build议你使用这个代码
int indexOfPage = scrollView.contentOffset.x / scrollView.frame.size.width;
但是如果你使用这个代码,你的视图并不需要完全放在indexOfPage为你提供的页面上。 因为我也推荐你只在这个方法中使用这个代码
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{}
当你的scrollView完成滚动并且你的页面的数量真的很锐利的时候会调用它
我build议你设置你的scrollView使用这个代码分页
[scrollView setPagingEnabled:YES];
所以最后它应该是这样的
-(void) methodWhereYouSetYourScrollView { //set scrollView [scrollView setPagingEnabled:YES]; scrollView.delegate = self; } -(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { int indexOfPage = scrollView.contentOffset.x / scrollView.frame.size.width; //your stuff with index }
在迅速,我会做扩展:
extension UIScrollView { var currentPage:Int{ return Int((self.contentOffset.x+(0.5*self.frame.size.width))/self.frame.width)+1 } }
然后,只需拨打:
scrollView.currentPage
如上所述,但作为一个类别
@interface UIScrollView (CurrentPage) -(int) currentPage; @end @implementation UIScrollView (CurrentPage) -(int) currentPage{ CGFloat pageWidth = self.frame.size.width; return floor((self.contentOffset.x - pageWidth / 2) / pageWidth) + 1; } @end
只要将当前偏移量除以页面大小即可:
CGFloat pageNum = (int)(scrollView.contentOffset.x / scrollView.frame.size.width);
这里有一些很好的答案。 但是,对于内容不完全适合页面的场景 – 如果像我一样想要使用UIPageControl
的结果,那么使用ceil
函数是非常重要的。
让我们举个例子,我有四个和一些内容页面。
我将基于我目前的现实生活中的例子。 内容大小宽度是3140点。 根据我的collections查看框架大小,页面宽度是728。
所以页数等于:
3140 / 728 = 4.313
我的numberOfPages
将是五。 其中四个将全部显示,最后一个将显示剩下的0.313
个内容。
现在, numberOfPages
为5意味着页面索引将为0,1,2,3和4。
当我向右滑动,分页到最终的偏移量时, scrollViewDidEndDecelerating
方法给出了最终的X偏移2412。
应用舍入计算:
2412 / 728 = 3.313 then rounded = 3
这是不正确的。 页面用户正在查看偏移应该是:
Offset / Page User Is Viewing 0 0 728 1 1456 2 2184 3 2412 4
使用ceil
正确的计算:
private func pageForOffset(offset:CGFloat, pageWidth width:CGFloat) -> Int { let page = Int(ceil(offset / width)) NSLog("\(__FUNCTION__) offset \(offset) width \(width) page \(page) ") return page }
Aoakenfo的解决scheme是惊人的,这是另一种解决scheme,将您的代码与函数scrollViewDidScroll和PageController
- (void)scrollViewDidScroll:(UIScrollView *)sender { if (sender == self.scroll) { int pageNum = (int)(self.scrPage.contentOffset.x / self.scrPage.frame.size.width); self.pagecontroller.currentPage =pageNum; } }
我从几个应用程序中提取出来…
- (NSInteger)currentPage { if (0 == self.frame.size.width) { NSLog(@"frame width == 0!"); return 0; } if (! self.currentPageValid) { _currentPage = round(self.contentOffset.x / self.frame.size.width); self.currentPageValid = YES; } return _currentPage; }
完整的源代码
在xCode 7.x swift 2.x中,你可以这样做:
//MARK: - ScrollView Extensions // Get the current page number extension UIScrollView { var currentPage: Int { return Int(round(self.contentOffset.x / self.bounds.size.width)) } // If you have reversed offset (start from contentSize.width to 0) var reverseCurrentPage: Int { return Int(round((contentSize.width - self.contentOffset.x) / self.bounds.size.width))-1 } }
为了迅速,我只是用这个
let width = scrollView.frame.width let page = round(scrollView.contentOffset.x/width)
非常简单,它基本上采用scrollview x的位置,将它除以scrollview的宽度,然后四舍五入。
你使用UIPageControl? 如果是这样,这有一个currentPage
属性。 如果没有,我想你需要从scrollView偏移量计算页面索引。
另一种方式 :
extension MyViewController: UIScrollViewDelegate { func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { let width = scrollView.frame.width let page = Int(round(scrollView.contentOffset.x/width)) print("CurrentPage:\(page)") } }