it-swarm.com.de

Aktuelle Seite abrufen

In meiner Bildlaufansicht möchte ich die aktuell angezeigte Seite abrufen (möglicherweise ist die Seite nicht der korrekte Begriff). Ich kann keine Variable finden, die dies enthält. Ich denke, es muss irgendwo aufbewahrt werden, da der Indikator anzeigen kann, welche Unteransicht der Bildlaufansicht gerade angezeigt wird.

Ist das vor uns verborgen oder gibt es eine Möglichkeit für mich, darauf zuzugreifen?

92
user440096

Für die aktuelle Seite gibt es keine UIScrollView-Eigenschaft. Sie können es berechnen mit:

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

Wenn Sie zur nächsten Seite auf- oder abrunden möchten, verwenden Sie:

CGFloat width = scrollView.frame.size.width;
NSInteger page = (scrollView.contentOffset.x + (0.5f * width)) / width;
254
AlexVogel

Ich empfehle Ihnen ziemlich, diesen Code zu verwenden 

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

wenn Sie diesen Code verwenden, muss Ihre Ansicht jedoch nicht genau auf der Seite sein, die indexOfPage Ihnen gibt .. _, weil ich Ihnen auch empfehle, diesen Code nur in dieser Methode zu verwenden 

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

dies wird aufgerufen, wenn Ihr ScrollView abgeschlossen ist und die Nummer Ihrer Seite wirklich scharf ist

Ich empfehle Ihnen, Ihre scrollView auf paging zu setzen, die mit diesem Code aktiviert ist

[scrollView setPagingEnabled:YES];

Endlich sollte es so aussehen

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

In Swift würde ich es in Erweiterung tun:

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

Dann rufen Sie einfach an:

scrollView.currentPage

Wie oben aber als Kategorie


@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

Hier gibt es schon einige gute Antworten. Für Szenarien, in denen Inhalt nicht genau in eine Seite passt - und wenn Sie wie ich das Ergebnis für eine UIPageControl verwenden möchten, müssen Sie unbedingt die Funktion ceil verwenden.

Nehmen wir ein Beispiel, wo ich "vier und ein bisschen" Seiten mit Inhalten habe. 

Ich stütze mich auf mein aktuelles Beispiel aus dem wirklichen Leben. Die Breite der Inhaltsgröße beträgt 3140 Punkte. Basierend auf der Größe meiner Kollektionsansicht beträgt die Seitenbreite 728.

Die Anzahl der Seiten ist also gleich:

 3140 / 728 = 4.313 

Meine numberOfPages wird fünf sein. Vier davon werden vollständig angezeigt, und die letzte davon - Seite fünf - zeigt den verbleibenden 0.313 des Inhalts.

Nun bedeutet numberOfPages fünf, dass die Seitenindizes 0, 1, 2, 3 und 4 sind. 

Wenn ich nach rechts streife und zum endgültigen Versatz blättere, ergibt die scrollViewDidEndDecelerating-Methode einen endgültigen X-Versatz von 2412.

Anwendung der Rundungsberechnung:

2412 / 728 = 3.313 then rounded = 3

Das ist falsch. Der Seitenbenutzer wird durch Versatz angezeigt.

Offset / Page User Is Viewing
0        0
728      1
1456     2
2184     3
2412     4

Die korrekte Berechnung mit 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

Teilen Sie einfach den aktuellen Versatz durch die Seitengröße:

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

Ein anderer Weg :

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

In xCode 7.x Swift 2.x können Sie Folgendes tun:

//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

Die Lösung von Aoakenfo ist erstaunlich, dies ist eine weitere Lösung, die Ihren Code mit der Funktion scrollViewDidScroll und PageController kombiniert

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

Ich habe das aus ein paar unserer Apps extrahiert ...

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

Vollständige Quelle hier

2
Barry

Für Swift würde ich das einfach verwenden 

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

Es ist ziemlich einfach: Es nimmt im Wesentlichen die x-Position der Bildlaufansicht, teilt sie durch die Breite der Bildlaufansicht und rundet sie dann.

2
Jackson U

Verwenden Sie ein UIPageControl? Wenn ja, hat dies eine currentPage-Eigenschaft. Wenn nicht, denke ich, müssen Sie den Seitenindex aus dem ScrollView-Offset berechnen.

1
wvteijlingen

Wenn Sie nach einer Möglichkeit suchen, in X für Xamarin zu arbeiten

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

Dieser Getter und Setter sollten die aktuelle Seite bereitstellen und zum Blättern zu der angegebenen Seite führen

0
soan saini