获取当前页面

问题描述 投票:93回答:13

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

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

iphone objective-c cocoa-touch uiscrollview
13个回答
255
投票

当前页面没有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;

2
投票

我从几个应用程序中提取了这个......

- (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;
}

Full source here


2
投票

对于swift,我会用它

    let width = scrollView.frame.width
    let page = round(scrollView.contentOffset.x/width)

非常简单,它基本上采用scrollview x位置,将其除以scrollview宽度,然后对其进行舍入。


1
投票

你在使用UIPageControl吗?如果是这样,这有一个currentPage财产。如果没有,我认为你需要从scrollView偏移量计算页面索引。


0
投票

如果任何人在C#中为Xamarin寻找方法

    public int CurrentIndex
    {
        get => (int)Math.Round(this.scrollView.ContentOffset.X / this.scrollView.Frame.Width);
        set => this.scrollView.ScrollRectToVisible(new CGRect(new CGPoint(this.scrollView.Frame.Size.Width * value, 0), this.scrollView.Frame.Size), true);
    }

此getter和Setter应该为您提供当前页面,以及滚动到指定页面


30
投票

我建议你使用这段代码

int indexOfPage = scrollView.contentOffset.x / scrollView.frame.size.width;

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

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{}

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

我建议您使用此代码将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
}

27
投票

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

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

然后打电话:

scrollView.currentPage

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

6
投票

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

CGFloat pageNum = (int)(scrollView.contentOffset.x / scrollView.frame.size.width);

6
投票

这里有一些很好的答案。但是,对于内容不完全适合页面的情况 - 如果像我一样,你想将结果用于UIPageControl,那么使用ceil函数是必不可少的。

让我们举一个例子,我有“四个和一点”的内容页面。

我将基于我当前的现实生活中的例子。内容大小宽度为3140点。根据我的集合视图框架大小,页面宽度为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
}

3
投票

在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
    }
}

3
投票

Aoakenfo的解决方案令人惊叹,这是将代码与函数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;
    }
}

3
投票

其他方式:

extension MyViewController: UIScrollViewDelegate {
    func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
        let width = scrollView.frame.width
        let page = Int(round(scrollView.contentOffset.x/width))
        print("CurrentPage:\(page)")
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.