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;
}
}