¿Cómo sabe cuál es la página / vista actual que se muestra dentro de un UIPageViewController
?
He anulado el viewDidAppear
método de las vistas de mis hijos, para que envíen una identificación a la vista principal en su viewDidAppear
mé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, viewDidAppear
ya 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
viewControllers
propiedad 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
viewControllers
propiedad 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.currentIndex
lugar deself.nextIndex = 0
para restaurar correctamente el índice cuando no se completa una transición. De lo contrario, corre el riesgo de terminar con uncurrentIndex
valor 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
0
que está mal.Usando delegado dentro de child viewController algo como:
que se activa en el interior
viewDidAppear
como: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.tag
durante 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
tag
propiedad de cada unoview
y 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
viewController
directamente desde laUIPageViewController
(versión Swift 4):O, si solo necesita el controlador de vista presentado actualmente en algún momento, simplemente úselo
pageViewController.viewControllers?.first
en 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