获取当前页面

96 iphone cocoa-touch objective-c uiscrollview ios

在我的滚动视图中,我想获取正在显示的当前页面(可能页面不是正确的术语).我找不到任何包含此变量的变量.但我认为它必须保留在某处,因为指示器能够显示当前正在显示滚动视图的哪个子视图.

这对我们来说是完全隐藏还是有办法让我访问它?

Ale*_*gel 258

UIScrollView当前页面没有属性.您可以使用以下方法计算:

int page = scrollView.contentOffset.x / scrollView.frame.size.width;
Run Code Online (Sandbox Code Playgroud)

如果要向上或向下舍入到最近的页面,请使用:

CGFloat width = scrollView.frame.size.width;
NSInteger page = (scrollView.contentOffset.x + (0.5f * width)) / width;
Run Code Online (Sandbox Code Playgroud)

  • 当用户滚动时,不要忘记使用`UIScrollViewDelegate`来获取当前页面! (7认同)
  • 这并不总是有效,有时框架宽度是错误的。 (2认同)

Jiř*_*lka 31

我建议你使用这段代码

int indexOfPage = scrollView.contentOffset.x / scrollView.frame.size.width;
Run Code Online (Sandbox Code Playgroud)

但是如果您使用此代码,则您的视图不需要完全位于indexOfPage为您提供的页面上.因为我还建议您仅在此方法中使用此代码

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{}
Run Code Online (Sandbox Code Playgroud)

当您的scrollView完成滚动并且页面数量非常清晰时调用

我建议您使用此代码将scrollView设置为分页

[scrollView setPagingEnabled:YES];
Run Code Online (Sandbox Code Playgroud)

所以最后看起来应该是这样的

-(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
}
Run Code Online (Sandbox Code Playgroud)


And*_*ius 27

在swift中,我会在扩展中执行:

extension UIScrollView {
    var currentPage:Int{
        return Int((self.contentOffset.x+(0.5*self.frame.size.width))/self.frame.width)+1
    }
}
Run Code Online (Sandbox Code Playgroud)

然后打电话:

scrollView.currentPage
Run Code Online (Sandbox Code Playgroud)

  • 几乎完美,我不得不在最后删除+1,因为在我的世界中一切都是零 (8认同)

use*_*349 12

如上所述,但作为一个类别


@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
Run Code Online (Sandbox Code Playgroud)

  • 这太过分了,只需使用return round(self.contentOffset.x/self.frame.size.width); 更简单,更容易理解.. (6认同)

aoa*_*nfo 6

只需将当前偏移量除以页面大小:

CGFloat pageNum = (int)(scrollView.contentOffset.x / scrollView.frame.size.width);
Run Code Online (Sandbox Code Playgroud)

  • 转换为int然后分配给float?为什么不把pageNum设为int;) (11认同)

Max*_*eod 6

这里有一些很好的答案.但是,对于内容不完全适合页面的情况 - 如果像我一样,您想将结果用于a UIPageControl,那么使用该ceil函数至关重要.

让我们举一个例子,我有"四个和一点"的内容页面.

我将基于我当前的现实生活中的例子.内容大小宽度为3140点.根据我的集合视图框架大小,页面宽度为728.

所以页数等于:

 3140 / 728 = 4.313 
Run Code Online (Sandbox Code Playgroud)

numberOfPages将是五岁.其中四个将完整显示,最后一个 - 第五页 - 将显示剩余0.313的内容.

现在,numberOfPages五是意味着页面索引将是0,1,2,3和4.

当我向右滑动,向最终偏移分页时,该scrollViewDidEndDecelerating方法给出的最终X偏移为2412.

应用舍入计算:

2412 / 728 = 3.313 then rounded = 3
Run Code Online (Sandbox Code Playgroud)

那是不对的.页面用户按偏移量查看应该是:

Offset / Page User Is Viewing
0        0
728      1
1456     2
2184     3
2412     4
Run Code Online (Sandbox Code Playgroud)

正确计算使用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
}
Run Code Online (Sandbox Code Playgroud)


Hem*_*ang 6

另一种方式

extension MyViewController: UIScrollViewDelegate {
    func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
        let width = scrollView.frame.width
        let page = Int(round(scrollView.contentOffset.x/width))
        print("CurrentPage:\(page)")
    }
}
Run Code Online (Sandbox Code Playgroud)