iphone - doesn - uiscrollview autolayout
Cambiar página en UIScrollView (11)
Tengo un UIScrollView con 10 páginas. Puedo pasar entre ellos. También quiero tener 2 botones (un botón de retroceso y uno siguiente) que al tocarlos irán a la página anterior o siguiente. Parece que no puedo encontrar una manera de hacer esto. Mucho de mi código proviene del código de muestra de control de página de Apple. ¿Alguien puede ayudar?
Gracias
Solución Swift
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)
}
Adicional a este código que agregó mjdth , recuerde colocarlo en viewWillAppear o viewDidAppear .
CGRect frame = scrollView.frame;
frame.origin.x = frame.size.width * pageNumberYouWantToGoTo;
frame.origin.y = 0;
[scrollView scrollRectToVisible:frame animated:YES];
Aquí hay un método estático en 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)
}
Aquí hay una implementación para 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)
}
y se invoca fácilmente llamando:
self.scrollToPage(1, animated: true)
Editar:
Una forma más agradable de hacerlo es admitir paginación horizontal y vertical. Aquí hay una extensión conveniente para eso:
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)
}
}
Esto crea una extensión en UIScrollView donde puede desplazarse a cualquier página, vertical u horizontal.
self.scrollView.scrollTo(horizontalPage: 0)
self.scrollView.scrollTo(verticalPage: 2, animated: true)
self.scrollView.scrollTo(horizontalPage: 1, verticalPage: 2, animated: true)
Para Swift 3 esta es una extensión que me parece muy conveniente:
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)
})
}
}
Y lo llamas así:
scrollView.scrollToPage(index: 1, animated: true, after: 0.5)
Primero crea una extensión UIScrollView como:
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)
}
}
entonces solo llama:
self.scrollView.setCurrentPage(position: 2) // where 2 is your desired page
Puedes hacerlo de esta manera:
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];
Si scrollRectToVisible no funciona, intente esto:
let frame = scrollView.frame
let offset:CGPoint = CGPoint(x: CGFloat(sender.currentPage) * frame.size.width, y: 0)
self.scrollView.setContentOffset(offset, animated: true)
Simplemente diga a los botones que se desplacen a la ubicación de la página:
CGRect frame = scrollView.frame;
frame.origin.x = frame.size.width * pageNumberYouWantToGoTo;
frame.origin.y = 0;
[scrollView scrollRectToVisible:frame animated:YES];
scrollRectToVisible no funcionaba para mí, así que tuve que animar el contentOffset. Este código funciona a toda velocidad 3.
func scrollToPage(_ page: Int) {
UIView.animate(withDuration: 0.3) {
self.scrollView.contentOffset.x = self.scrollView.frame.width * CGFloat(page)
}
}
scroll.contentOffset = CGPointMake(scroll.frame.size.width*pageNo, 0);