web-dev-qa-db-ja.com

現在のページを取得する

スクロールビューで、表示されている現在のページを取得します(ページは正しい用語ではない可能性があります)。これを保持する変数が見つかりません。しかし、スクロールビューのどのサブビューが現在表示されているかをインジケーターが示すことができるため、どこかに保持する必要があると思います。

これは完全に私たちから隠されていますか、または私がそれにアクセスする方法はありますか?

95
user440096

現在のページには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;
258
AlexVogel

このコードを使用することをお勧めします

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
}
31
Jiří Zahálka

In Swift私は拡張でそれをします:

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
12
user363349

ここにはすでにいくつかの良い答えがあります。ただし、コンテンツがページに正確に収まらないシナリオの場合-私のようにUIPageControlの結果を使用する場合は、ceil関数を使用することが不可欠です。

「4ビット」のコンテンツページがある例を見てみましょう。

これは、現在の実生活の例に基づいています。コンテンツサイズの幅は3140ポイントです。コレクションビューのフレームサイズに基づいて、ページ幅は728です。

したがって、ページ数は次のとおりです。

 3140 / 728 = 4.313 

私のnumberOfPagesは5になります。そのうち4つは完全に表示され、最後の5ページは残りの0.313のコンテンツ。

現在、numberOfPagesが5であるということは、ページインデックスが0、1、2、3、および4になることを意味します。

最終オフセットに向かってページングして右にスワイプすると、scrollViewDidEndDeceleratingメソッドは2412の最終Xオフセットを提供します。

丸め計算の適用:

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
}
6
Max MacLeod

現在のオフセットをページサイズで除算するだけです。

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

別の方法

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

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

Swift私はこれを使うだけです

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

かなり簡単です。基本的には、スクロールビューのx位置を取得し、スクロールビューの幅で割ってから丸めます。

3
Jackson U

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
pabloverd

これをいくつかのアプリから抽出しました...

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

ここに完全なソース

2
user246672

UIPageControlを使用していますか?その場合、これにはcurrentPageプロパティがあります。そうでない場合、scrollViewオフセットからページインデックスを計算する必要があると思います。

1
Rengers

XamarinのC#で行う方法を探している方

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

このゲッターとセッターは、現在のページを提供するだけでなく、指定されたページにスクロールできるようにする必要があります

0
soan saini