En mi caso, el padre UIViewController
contiene UIPageViewController
cuál contiene UINavigationController
cuál contiene UIViewController
. Necesito agregar un gesto de deslizamiento al último controlador de vista, pero los deslizamientos se manejan como si pertenecieran al controlador de vista de página. Traté de hacer esto tanto programáticamente como a través de xib pero sin resultado.
Entonces, según tengo entendido, no puedo lograr mi objetivo hasta que UIPageViewController
maneje sus gestos. ¿Cómo resolver este problema?
ios
uiviewcontroller
uigesturerecognizer
uipageviewcontroller
usuario2159978
fuente
fuente
pageViewControllerObject.view.userInteractionEnabled = NO;
UIPageViewController
tieneUINavigationController
. El cliente quiere hacer estallar el controlador de navegación en el gesto de deslizar (si es posible), pero el controlador de vista de página maneja los deslizadores en su lugarRespuestas:
La forma documentada de evitar el
UIPageViewController
desplazamiento es no asignar ladataSource
propiedad. Si asigna la fuente de datos, pasará al modo de navegación 'basado en gestos', que es lo que está tratando de evitar.Sin una fuente de datos, usted proporciona manualmente los controladores de vista cuando lo desee con el
setViewControllers:direction:animated:completion
método y se moverá entre los controladores de vista a pedido.Lo anterior se puede deducir de la documentación de Apple de UIPageViewController (Descripción general, segundo párrafo):
fuente
fuente
for (UIView *view in self.pageViewController.view.subviews) {
Traduzco la respuesta de user2159978 a Swift 5.1
fuente
Implementando la solución de @ lee (@ user2159978) como una extensión:
Uso: (en
UIPageViewController
)fuente
var scrollView: UIScrollView? { for view in view.subviews { if let subView = view as? UIScrollView { return subView } } return nil }
He estado luchando contra esto por un tiempo y pensé que debería publicar mi solución, siguiendo la respuesta de Jessedc; eliminando el origen de datos de PageViewController.
Agregué esto a mi clase PgeViewController (vinculado a mi controlador de vista de página en el guión gráfico, hereda ambos
UIPageViewController
yUIPageViewControllerDataSource
):Esto se puede invocar cuando aparece cada vista secundaria (en este caso para deshabilitarla);
Espero que esto ayude a alguien, no es tan limpio como me gustaría, pero no se siente demasiado hacky, etc.
EDITAR: si alguien quiere traducir esto a Objective-C, por favor hazlo :)
fuente
Editar : esta respuesta funciona solo para el estilo de curva de página. La respuesta de Jessedc es mucho mejor: funciona independientemente del estilo y se basa en un comportamiento documentado .
UIPageViewController
expone su conjunto de reconocedores de gestos, que puede usar para deshabilitarlos:fuente
Si desea
UIPageViewController
mantener su capacidad de deslizar, mientras permite que sus controles de contenido usen sus funciones (deslizar para eliminar, etc.), simplemente desactívelocanCancelContentTouches
enUIPageViewController
.Poner esto en su
UIPageViewController
'sviewDidLoad
func. (Rápido)El
UIPageViewController
tiene una subvista autogenerado que se encarga de los gestos. Podemos evitar que estas subvistas cancelen los gestos de contenido.De...
Deslice para eliminar en una tableView que está dentro de un pageViewController
fuente
Una extensión útil
UIPageViewController
para habilitar y deshabilitar deslizar.fuente
Lo resolví así (Swift 4.1)
fuente
Manera rápida para la respuesta @lee
fuente
Respuesta similar a @ user3568340
Swift 4
fuente
Gracias a la respuesta de @ user2159978.
Lo hago un poco más comprensible.
fuente
Las respuestas que encontré me parecen muy confusas o incompletas, así que aquí hay una solución completa y configurable:
Paso 1:
Dele a cada uno de sus elementos de PVC la responsabilidad de determinar si el desplazamiento hacia la izquierda y la derecha están habilitados o no.
Cada uno de sus controladores de vista de PVC debe implementar el protocolo anterior.
Paso 2:
En sus controladores de PVC, desactive el desplazamiento si es necesario:
Paso 3:
Agregue los métodos efectivos de bloqueo de desplazamiento a su PVC:
Paso 4:
Actualice los atributos relacionados con el desplazamiento cuando llegue a una nueva pantalla (si realiza la transición manualmente a alguna pantalla, no olvide llamar al método enableScroll):
fuente
Hay un enfoque mucho más simple que la mayoría de las respuestas aquí sugeridas, que es regresar
nil
en las devoluciones de llamadaviewControllerBefore
yviewControllerAfter
dataSource.Esto deshabilita el gesto de desplazamiento en dispositivos iOS 11+, al tiempo que mantiene la posibilidad de usar
dataSource
(para cosas comopresentationIndex
/presentationCount
utilizado para el indicador de página)También deshabilita la navegación a través de. los
pageControl
(los puntos en la parte inferior)fuente
pageViewController.view.isUserInteractionEnabled = false
fuente
Traduciendo la respuesta de @ user2159978 a C #:
fuente
(Swift 4) Puede eliminar los gestos de reconocimiento de su pageViewController:
Si lo prefieres en extensión:
y
pageViewController.removeGestureRecognizers
fuente
Declararlo así:
Entonces úsalo así:
fuente
Enumerar las subvistas para encontrar el scrollView de un
UIPageViewController
no funcionó para mí, ya que no puedo encontrar ningún scrollView en mi subclase de controlador de página. Entonces, lo que pensé hacer es deshabilitar los reconocedores de gestos, pero lo suficientemente cuidadoso como para no deshabilitar los necesarios.Entonces se me ocurrió esto:
¡Pon eso dentro
viewDidLoad()
y listo!fuente
Agregue esto en su clase pageviewcontroller. 100% trabajando
fuente
simplemente agregue esta propiedad de control en su subclase UIPageViewController :
fuente