voz teclado swype solo pantalla over nada home hacer habla flotante desbloquear desactivar deja control boton bloqueada assistive activar activado ios uiviewcontroller uigesturerecognizer uipageviewcontroller

ios - teclado - ¿Cómo desactivo el gesto de deslizar de UIPageViewController?



se ha activado el control de voz y no me deja desbloquear el iphone (13)

En mi caso, el padre UIViewController contiene UIPageViewController que contiene UINavigationController que contiene UIViewController . Quiero agregar un gesto de deslizamiento al último controlador de vista, pero los golpes 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 ningún resultado.

Entonces entiendo que no puedo lograr mi objetivo hasta que UIPageViewController maneje sus gestos. ¿Cómo resolver este problema?


(Swift 4) Puedes eliminar gestureRecognizers de tu página ViewController:

pageViewController.view.gestureRecognizers?.forEach({ (gesture) in view.removeGestureRecognizer(gesture) })

Si prefieres en extensión:

extension UIViewController{ func removeGestureRecognizers(){ view.gestureRecognizers?.forEach({ (gesture) in view.removeGestureRecognizer(gesture) }) } }

y pageViewController.removeGestureRecognizers


Gracias a la respuesta de @ user2159978.

Lo hago un poco más comprensible.

- (void)disableScroll{ for (UIView *view in self.pageViewController.view.subviews) { if ([view isKindOfClass:[UIScrollView class]]) { UIScrollView * aView = (UIScrollView *)view; aView.scrollEnabled = NO; } } }


He estado luchando con 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 (vinculada a mi controlador de vista de página en el guión gráfico, hereda ambos UIPageViewController y UIPageViewControllerDataSource ):

static func enable(enable: Bool){ let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate let pageViewController = appDelegate.window!.rootViewController as! PgeViewController if (enable){ pageViewController.dataSource = pageViewController }else{ pageViewController.dataSource = nil } }

Esto se puede llamar cuando aparece cada subvista (en este caso para deshabilitarla);

override func viewDidAppear(animated: Bool) { PgeViewController.enable(false) }

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


Implementando la solución @ lee''s (@ user2159978''s) como una extensión:

extension UIPageViewController { var isPagingEnabled: Bool { get { var isEnabled: Bool = true for view in view.subviews { if let subView = view as? UIScrollView { isEnabled = subView.isScrollEnabled } } return isEnabled } set { for view in view.subviews { if let subView = view as? UIScrollView { subView.isScrollEnabled = newValue } } } } }

Uso: (en UIPageViewController )

self.isPagingEnabled = false


La forma documentada para evitar que el UIPageViewController desplace es no asignar la propiedad dataSource . Si asigna la fuente de datos, pasará al modo de navegación basado en gestos, que es lo que intenta evitar.

Sin una fuente de datos, usted proporciona manualmente los controladores de vista cuando lo desee con setViewControllers:direction:animated:completion método de setViewControllers:direction:animated:completion y se moverá entre los controladores de vista bajo demanda.

Lo anterior se puede deducir de la documentación de Apple de UIPageViewController (Descripción general, segundo párrafo):

Para admitir la navegación basada en gestos, debe proporcionar sus controladores de visualización utilizando un objeto de origen de datos.


Lo resolví así (Swift 4.1)

if let scrollView = self.view.subviews.filter({$0.isKind(of: UIScrollView.self)}).first as? UIScrollView { scrollView.isScrollEnabled = false }


Si desea que su UIPageViewController mantenga su capacidad de deslizamiento, mientras permite que sus controles de contenido usen sus funciones (Deslizar para eliminar, etc.), simplemente apague canCancelContentTouches en UIPageViewController .

Pon esto en el UIPageViewController tu UIPageViewController . (Rápido)

if let myView = view?.subviews.first as? UIScrollView { myView.canCancelContentTouches = false }

El UIPageViewController tiene una subvista autogenerada que maneja los gestos. Podemos evitar que estas subvistas cancelen los gestos de contenido.

De...

Deslizar para eliminar en una tabla Vista que está dentro de una página ViewController


Similar a @ user3568340 respuesta

Swift 4

private var _enabled = true public var enabled:Bool { set { if _enabled != newValue { _enabled = newValue if _enabled { dataSource = self } else{ dataSource = nil } } } get { return _enabled } }


Traduciendo la respuesta de @ user2159978 a C #:

foreach (var view in pageViewController.View.Subviews){ var subView = view as UIScrollView; if (subView != null){ subView.ScrollEnabled = enabled; } }


Una extensión útil de UIPageViewController para habilitar y deshabilitar el deslizamiento.

extension UIPageViewController { func enableSwipeGesture() { for view in self.view.subviews { if let subView = view as? UIScrollView { subView.isScrollEnabled = true } } } func disableSwipeGesture() { for view in self.view.subviews { if let subView = view as? UIScrollView { subView.isScrollEnabled = false } } } }


Editar : esta respuesta funciona solo para el estilo de curl de página. La respuesta de Jessedc es mucho mejor: funciona independientemente del estilo y depende del comportamiento documentado .

UIPageViewController expone su matriz de reconocedores de gestos, que puede usar para deshabilitarlos:

// myPageViewController is your UIPageViewController instance for (UIGestureRecognizer *recognizer in myPageViewController.gestureRecognizers) { recognizer.enabled = NO; }


Traduzco la respuesta de user2159978 a Swift

func removeSwipeGesture(){ for view in self.pageViewController!.view.subviews { if let subView = view as? UIScrollView { subView.scrollEnabled = false } } }


for (UIScrollView *view in self.pageViewController.view.subviews) { if ([view isKindOfClass:[UIScrollView class]]) { view.scrollEnabled = NO; } }