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
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];
scroll.contentOffset = CGPointMake(scroll.frame.size.width*pageNo, 0);
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)
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)
}
}
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)
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];
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)
}
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)
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)
}