69 votes

Modifier la page sur UIScrollView

J'ai un UIScrollView avec 10 pages. Je suis en mesure de naviguer entre elles. Je souhaite également disposer de deux boutons (un bouton retour et un bouton suivant) qui, lorsqu'ils sont touchés, permettent de passer à la page précédente ou suivante. Je ne parviens pas à trouver un moyen de le faire. Une grande partie de mon code provient de l'exemple de code de contrôle de page d'Apple. Quelqu'un peut-il m'aider ?

Gracias

146voto

mjdth Points 3828

Il suffit d'indiquer 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];

0 votes

Parfait ! Merci pour votre aide.

0 votes

C'est un code parfait. J'ajoute deux images dans chaque page de la vue défilante. Dans la dernière page, je n'ai qu'une seule image. Comment gérer cette situation pour faire défiler la dernière page ?

3 votes

Il convient de noter que pageNumberYouWantToGoTo commence à la page zéro et non à la page un. Et la dernière page que vous avez serait alors inférieure d'une unité à ce qu'elle est réellement. (par exemple, pour aller à la page 7, vous devez entrer 6 dans le code).

35voto

Pontus Points 715

Voici une mise en œuvre 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)

Editar:

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 n'importe quelle page, verticale ou horisontale.

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

23voto

Mr.Guru.Patel Points 21
scroll.contentOffset = CGPointMake(scroll.frame.size.width*pageNo, 0);

1 votes

Beaucoup plus succinct que la réponse acceptée. Bien que j'utilise personnellement scroll.contentOffset.y pour le paramètre 0

0 votes

Cette réponse est plus claire et plus efficace que la réponse ci-dessus.

17voto

Gerardo Medina Points 279

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

8voto

David Hernandez Points 233

Pour Swift 3 il s'agit d'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 tu l'appelles comme ça :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X