inside doesn iphone uiscrollview

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