web-dev-qa-db-fra.com

Changer de page sur UIScrollView

J'ai un UIScrollView avec 10 pages. Je suis capable de chiner entre eux. Je veux aussi avoir 2 boutons (un bouton arrière et un bouton suivant) qui, une fois touché, iront à la page précédente ou suivante Je n'arrive pas à trouver un moyen de faire cela. Une grande partie de mon code provient de l'exemple de code de contrôle de page d'Apple. Quelqu'un peut aider?

Merci

53
john

Vous indiquez simplement aux boutons de défiler jusqu'à l'emplacement de la page:

CGRect frame = scrollView.frame;
frame.Origin.x = frame.size.width * pageNumberYouWantToGoTo;
frame.Origin.y = 0;
[scrollView scrollRectToVisible:frame animated:YES];
130
mjdth
scroll.contentOffset = CGPointMake(scroll.frame.size.width*pageNo, 0);
18
Mr.Guru.Patel

Voici une implémentation pour Swift 4 :

func scrollToPage(page: Int, animated: Bool) {
    var frame: CGRect = self.scrollView.frame
    frame.Origin.x = frame.size.width * CGFloat(page)
    frame.Origin.y = 0
    self.scrollView.scrollRectToVisible(frame, animated: animated)
}

et est facilement invoqué en appelant:

self.scrollToPage(1, animated: true)

Modifier:

Une façon plus agréable de procéder consiste à prendre en charge la pagination horizontale et verticale. Voici une extension pratique pour cela:

extension UIScrollView {

    func scrollTo(horizontalPage: Int? = 0, verticalPage: Int? = 0, animated: Bool? = true) {
        var frame: CGRect = self.frame
        frame.Origin.x = frame.size.width * CGFloat(horizontalPage ?? 0)
        frame.Origin.y = frame.size.width * CGFloat(verticalPage ?? 0)
        self.scrollRectToVisible(frame, animated: animated ?? true)
    }

}

Cela crée une extension sur UIScrollView où vous pouvez faire défiler une page, verticale ou horizontale.

self.scrollView.scrollTo(horizontalPage: 0)
self.scrollView.scrollTo(verticalPage: 2, animated: true)
self.scrollView.scrollTo(horizontalPage: 1, verticalPage: 2, animated: true)
12
Pontus

scrollRectToVisible ne fonctionnait pas pour moi, j'ai donc dû animer le contentOffset. Ce code fonctionne dans Swift 3.

func scrollToPage(_ page: Int) {
    UIView.animate(withDuration: 0.3) { 
        self.scrollView.contentOffset.x = self.scrollView.frame.width * CGFloat(page)
    }
}
12
Chuy47

Pour Swift 3 ceci est une extension que je trouve très pratique:

extension UIScrollView {
    func scrollToPage(index: UInt8, animated: Bool, after delay: TimeInterval) {
        let offset: CGPoint = CGPoint(x: CGFloat(index) * frame.size.width, y: 0)
        DispatchQueue.main.asyncAfter(deadline: .now() + delay, execute: {
            self.setContentOffset(offset, animated: animated)
        })
    }
}

Et vous l'appelez comme ça:

scrollView.scrollToPage(index: 1, animated: true, after: 0.5)
7
David Hernandez

Commencez par créer une extension UIScrollView telle que:

extension UIScrollView {

    func setCurrentPage(position: Int) {
        var frame = self.frame;
        frame.Origin.x = frame.size.width * CGFloat(position)
        frame.Origin.y = 0
        scrollRectToVisible(frame, animated: true)
    }

}

alors appelez simplement:

self.scrollView.setCurrentPage(position: 2)  // where 2 is your desired page

Vous pouvez le faire de cette façon: 

CGRect lastVisibleRect;
CGSize contentSize = [_scrollView contentSize];
lastVisibleRect.size.height = contentSize.height; 
lastVisibleRect.Origin.y = 0.0; 
lastVisibleRect.size.width = PAGE_WIDTH; 
lastVisibleRect.Origin.x  = contentSize.width - PAGE_WIDTH * (_totalItems - pageIndex); // total item of scrollview and your current page index

[_scrollView scrollRectToVisible:lastVisibleRect animated:NO];
2
HDT

Voici une méthode statique dans Swift:

static func scrollToPage(scrollView: UIScrollView, page: Int, animated: Bool) {
    var frame: CGRect = scrollView.frame
    frame.Origin.x = frame.size.width * CGFloat(page);
    frame.Origin.y = 0;
    scrollView.scrollRectToVisible(frame, animated: animated)
}
2
maxhud

Si scrollRectToVisible ne fonctionne pas, essayez ceci:

let frame = scrollView.frame
    let offset:CGPoint = CGPoint(x: CGFloat(sender.currentPage) * frame.size.width, y: 0)
    self.scrollView.setContentOffset(offset, animated: true)
0
giLisH

Solution rapide

func changePage(pageControl: UIPageControl) {

    let page = CGFloat(pageControl.currentPage)
    var frame = self.scrollView.frame
    frame.Origin.x = frame.size.width * page
    frame.Origin.y = 0
    self.scrollView.scrollRectToVisible(frame, animated: true)
}
0