获取当前页面
在我的滚动视图中,我想获取正在显示的当前页面(也许页面不是正确的术语)。 我找不到任何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)") } }