viewpager uipageviewcontrollerdatasource tutorial pageviewcontroller page control ios swift

ios - tutorial - uipageviewcontrollerdatasource



Obtener la posiciĆ³n de desplazamiento de UIPageViewController (4)

El desplazamiento de UIPageViewController no funciona como la vista de desplazamiento normal y no puede obtener scrollView.contentOffset como otras vistas de desplazamiento.

Así que aquí hay un truco para saber qué sucede cuando el usuario se desplaza:

Primero, tiene que encontrar scrollview y configurar el delegado en el viewController actual como dicen otras respuestas.

class YourViewController : UIPageViewController { var startOffset = CGFloat(0) //define this override func viewDidLoad() { super.viewDidLoad() //from other answers for v in view.subviews{ if v is UIScrollView { (v as! UIScrollView).delegate = self } } } . . . } extension YourViewController : UIScrollViewDelegate{ func scrollViewWillBeginDragging(_ scrollView: UIScrollView) { startOffset = scrollView.contentOffset.x } public func scrollViewDidScroll(_ scrollView: UIScrollView) { var direction = 0 //scroll stopped if startOffset < scrollView.contentOffset.x { direction = 1 //going right }else if startOffset > scrollView.contentOffset.x { direction = -1 //going left } let positionFromStartOfCurrentPage = abs(startOffset - scrollView.contentOffset.x) let percent = positionFromStartOfCurrentPage / self.view.frame.width //you can decide what to do with scroll } }

Estoy usando un UIPageViewController , y necesito obtener la posición de desplazamiento del ViewController a medida que los usuarios se deslizan para poder desvanecer parcialmente algunos activos mientras la vista está en transición al siguiente UIViewController .

Los métodos de delegado y UIPageViewController de datos de UIPageViewController no parecen proporcionar ningún acceso a esto, e internamente supongo que UIPageViewController debe estar usando una vista de desplazamiento en algún lugar, pero no parece tener una subclase directamente, por lo que no estoy capaz de llamar

func scrollViewDidScroll(scrollView: UIScrollView) { }

He visto alguna otra sugerencia de publicaciones para obtener una referencia al pageViewController!.view.subviews y luego el primer índice es scrollView, pero esto parece muy intrépido. Me pregunto si hay una manera más estándar de manejar esto.


Puede buscar el UIScrollView dentro de su UIPageViewController . Para hacer eso, tendrás que implementar el UIScrollViewDelegate .

Después de eso puede obtener su scrollView:

for v in pageViewController.view.subviews{ if v.isKindOfClass(UIScrollView){ (v as UIScrollView).delegate = self } }

Después de eso, puede usar todos los métodos UIScrollViewDelegate y, por lo tanto, puede anular el método scrollViewDidScroll donde puede obtener la posición scroll:

func scrollViewDidScroll(scrollView: UIScrollView) { //your Code }

O si quieres una sola línea :

let scrollView = view.subviews.filter { $0 is UIScrollView }.first as! UIScrollView scrollView.delegate = self


Similar a la respuesta de Christian, pero un poco más Swift-like (y no sin necesidad de continuar recorriendo view.subviews):

for view in self.view.subviews { if let view = view as? UIScrollView { view.delegate = self break } }


var pageViewController: PageViewController? { didSet { pageViewController?.dataSource = self pageViewController?.delegate = self scrollView?.delegate = self } } lazy var scrollView: UIScrollView? = { for subview in pageViewController?.view?.subviews ?? [] { if let scrollView = subview as? UIScrollView { return scrollView } } return nil }() extension BaseFeedViewController: UIScrollViewDelegate { func scrollViewDidScroll(_ scrollView: UIScrollView) { let offset = scrollView.contentOffset.x let bounds = scrollView.bounds.width let page = CGFloat(self.currentPage) let count = CGFloat(viewControllers.count) let percentage = (offset - bounds + page * bounds) / (count * bounds - bounds) print(abs(percentage)) } }