¿Cómo sabe cuál es la página / vista actual que se muestra dentro de un UIPageViewController?
He anulado el viewDidAppearmétodo de las vistas de mis hijos, para que envíen una identificación a la vista principal en su viewDidAppearmétodo.
Sin embargo, el problema es este: no puedo usar esa identificación de manera confiable como identificación para la página mostrada. porque si el usuario pasa la página pero a la mitad decide detener el paso y volver a colocar la página, viewDidAppearya habrá sido llamado. (la vista es visible detrás de la página enrollada).
Tal vez solo debería cambiar a una nueva identificación si la vista actual desaparece. Pero me pregunto si no hay una forma más sencilla de devolver la vista que es actualmente visible.

viewDidAppear:animated:lugar?Respuestas:
Debe realizar un seguimiento manual de la página actual. El método delegado
pageViewController:didFinishAnimating:previousViewControllers:transitionCompleted:le dirá cuándo actualizar esa variable. El último argumento del métodotransitionCompleted:puede indicarle si un usuario completó una transición de cambio de página o no.fuente
A partir de iOS 6, descubrí que la
viewControllerspropiedad de UIPageViewController se actualiza constantemente para que siempre contenga el controlador de una vista que representa la página actual, y nada más. Por lo tanto, puede acceder a la página actual llamandoviewControllers[0](suponiendo que solo muestre un controlador de vista a la vez).La matriz viewController solo se actualiza una vez que la página "se bloquea" en su lugar, por lo que si un usuario decide revelar parcialmente la página siguiente, no se convierte en la página "actual" a menos que complete la transición.
Si desea realizar un seguimiento de los "números de página", asigne a sus controladores de vista un valor de índice a medida que los crea a través de los métodos de origen de datos UIPageViewController.
Así por ejemplo:
Pero tenga en cuenta los comentarios de que esto no es confiable.
fuente
viewControllerspropiedad y obtengo los controladores de vista correctos, pero cuando giro, en el métodospineLocationForInterfaceOrientation, ya no obtengo los controladores de vista correctos. Así que me limité a mantener mi propia propiedad currentPage en lugar de depender siempre deviewControllers.Desafortunadamente, todos los métodos anteriores no me ayudaron. Sin embargo, he encontrado la solución usando etiquetas. Puede que no sea lo mejor, pero funciona y espero que ayude a alguien:
En Swift: (gracias a @Jessy )
Ejemplo: gist
fuente
Basándose en la respuesta de Ole ...
Así es como implementé los 4 métodos para rastrear la página actual y actualizar el indicador de página al índice correcto:
fuente
self.nextIndex = self.currentIndexlugar deself.nextIndex = 0para restaurar correctamente el índice cuando no se completa una transición. De lo contrario, corre el riesgo de terminar con uncurrentIndexvalor de 0 al desplazarse rápidamente hacia adelante y hacia atrás en algún lugar en el medio de sus páginas.La siguiente solución funcionó para mí.
Apple podría evitar muchas molestias haciendo que la paginación nativa de la vista de desplazamiento UIPageViewController sea más configurable. Tuve que recurrir a superponer un nuevo UIView y UIPageControl solo porque la paginación nativa de UIPageViewController no admite un fondo transparente o un reposicionamiento dentro del marco de la vista.
fuente
Rápido 4
Sin código innecesario. 3 formas de hacerlo. Usando el método UIPageViewControllerDelegate .
fuente
pageViewController.viewControllers. ¿Cómo sabes viewControllers? .Primero es el en cuestión?Estoy realizando un seguimiento del índice de la página utilizando una pequeña función y especificando pageIndex como NSInteger estático.
y llamando
[self setPageIndex];dentro de la función especificada por Ole y también después de detectar el cambio de orientación.fuente
Primero usé la solución de Corey pero no funcionaba en iOS5 y luego terminé usando,
Intentó cambiar de página y funciona bien por ahora.
fuente
Desafortunadamente, nada de lo anterior funciona para mí.
Tengo dos controladores de vista y cuando desplazo ligeramente (alrededor de 20px) la última vista hacia atrás, se activa el delegado:
pageViewController:didFinishAnimating:previousViewControllers:transitionCompleted:y diciendo que la página actual (índice) es la
0que está mal.Usando delegado dentro de child viewController algo como:
que se activa en el interior
viewDidAppearcomo:Trabajó para mi.
fuente
Esto me funciona de manera confiable
Tengo un UIPageController personalizado. Esta pageController.currentPage se actualiza desde el UIViewController mostrado en la vista
fuente
Lo he estado usando
view.tagdurante un tiempo, intentar hacer un seguimiento de la página actual era demasiado complicado.En este código, el índice se almacena dentro de la
tagpropiedad de cada unoviewy se usa para buscar el VC siguiente o anterior. Con este método también es posible crear un desplazamiento infinito. Consulte el comentario en el código para ver también esta solución:fuente
Gracias por su respuesta chicos, enfrenté un problema similar, tuve que almacenar index. Modifico ligeramente mi código, lo pego a continuación:
fuente
fuente
Debajo del código de demostración (en Swift 2) que demuestra cómo se hace esto mediante la implementación de un sencillo tutorial de deslizamiento de imágenes. Comentarios en el propio código:
fuente
Tengo una matriz viewControllers, que muestro en UIPageViewController .
Lo importante a destacar aquí es que el setViewControllers método de UIPageViewController no da ninguna devolución de llamada delegado. Las devoluciones de llamada delegadas solo representan acciones táctiles del usuario en UIPageViewController .
fuente
Esta es la solución que se me ocurrió:
Uso:
Asegúrese de establecer el título inicial
fuente
La forma más sencilla de abordar este IMHO es utilizar el PageControl para almacenar el resultado potencial de la transición y luego revertir si la transición se canceló. Esto significa que el control de la página cambia tan pronto como el usuario comienza a deslizar, lo cual está bien para mí. Esto requiere que tenga su propia matriz de UIViewControllers (en este ejemplo llamado
allViewControllers)fuente
¿Qué tal pedir un
viewControllerdirectamente desde laUIPageViewController(versión Swift 4):O, si solo necesita el controlador de vista presentado actualmente en algún momento, simplemente úselo
pageViewController.viewControllers?.firsten ese momento.fuente
En Swift 5 y la siguiente respuesta de Sirvine
En este caso, no me importa qué clase de UIViewController están incrustados
fuente
Devolverá el índice de la página actual. y debe usar este código bajo la función delegada de UIPageViewController (didFinishAnimating).
fuente