获取当前页面

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