Obtenir la page actuelle

Dans ma vue de défilement, je souhaite obtenir la page actuelle affichée (peut-être que le terme n’est pas correct). Je ne trouve aucune variable qui contienne cela. Mais je pense que cela doit avoir lieu quelque part, car l’indicateur est capable de montrer quelle sous-vue de la vue de défilement est actuellement affichée.

Est-ce que cela nous est complètement caché ou est-il possible d’y accéder?

Il n’y a pas de propriété UIScrollView pour la page en cours. Vous pouvez le calculer avec:

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

Si vous souhaitez arrondir à la page la plus proche, utilisez:

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

Je vous recommande d’utiliser ce code

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

mais si vous utilisez ce code, votre vue ne doit pas nécessairement figurer exactement sur la page que vous propose indexOfPage. C’est parce que je vous recommande également d’utiliser ce code uniquement dans cette méthode

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

qui est appelé lorsque votre scrollView a fini de défiler et d’avoir le numéro de votre page vraiment net

Je vous recommande de définir votre scrollView sur paging activé avec ce code

 [scrollView setPagingEnabled:YES]; 

Donc finalement ça devrait ressembler à ça

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

En rapide je le ferais en extension:

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

Alors appelez simplement:

 scrollView.currentPage 

Comme ci-dessus mais en tant que catégorie

 @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 

Il suffit de diviser le décalage actuel par la taille de la page:

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

Il y a déjà de bonnes réponses ici. Cependant, pour les scénarios où le contenu ne correspond pas exactement à une page – et si, comme moi, vous souhaitez utiliser le résultat d’un UIPageControl , il est essentiel d’utiliser la fonction ceil .

Prenons un exemple où j’ai des pages de contenu “quatre et un peu”.

Je me baserai sur mon exemple actuel. La largeur du contenu est de 3140 points. Selon la taille de la vue de ma collection, la largeur de la page est 728.

Donc, le nombre de pages est égal à:

  3140 / 728 = 4.313 

Mon nombre de numberOfPages va être cinq. Quatre d’entre elles apparaîtront dans leur intégralité, et la dernière, à la page cinq, montrera ce qui rest de 0.313 contenu.

Maintenant, numberOfPages étant cinq signifie que les index de page seront 0, 1, 2, 3 et 4.

Lorsque je balaye vers la droite, vers la direction du décalage final, la méthode scrollViewDidEndDecelerating donne un décalage X final de 2412.

Appliquer le calcul d’arrondi:

 2412 / 728 = 3.313 then rounded = 3 

C’est incorrect L’utilisateur de la page visualisé par offset doit être:

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

Le calcul correct en utilisant 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 } 

Dans xCode 7.x swift 2.x vous pouvez faire:

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

La solution d’Aoakenfo est incroyable, c’est une autre solution combinant votre code avec la fonction scrollViewDidScroll et 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; } } 

Je l’ai extrait de quelques unes de nos applications …

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

Source complète ici

Pour rapide je voudrais juste utiliser cette

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

Assez simple, il prend fondamentalement la position de défilement x, le divise par la largeur de la vue de défilement, puis l’arrondit.

Utilisez-vous un UIPageControl? Si c’est le cas, cela a une propriété currentPage . Si ce n’est pas le cas, je pense que vous devrez calculer l’index de la page à partir du décalage de scrollView.

Une autre façon :

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

Si quelqu’un cherche une façon de faire en C # pour 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); } 

Ce getter et Setter devrait vous fournir la page courante et vous permettre de faire défiler la page spécifiée