ios iphone uiscrollview zoom zooming

ios - Desactivar el uso de zoom en UIScrollView



iphone zooming (9)

¿Alguien sabe una forma de desactivar temporalmente el zoom cuando se utiliza un UIScrollView?

Veo que puedes deshabilitar el desplazamiento usando lo siguiente:

self.scrollView.scrollEnabled = false;

pero no veo un comando similar para hacer zoom. ¿Alguna idea?


Versión de Swift 3:

func lockScrollViewZooming() { scrollView.minimumZoomScale = 1.0 scrollView.minimumZoomScale = 1.0 scrollView.bounces = false scrollView.bouncesZoom = false // Also, if you have double tap recognizer, // remember to remove it scrollView.removeGestureRecognizer(doubleTapGestureRecognizer) } func unlockScrollViewZooming() { scrollView.minimumZoomScale = 1.0 scrollView.maximumZoomScale = 4.0 scrollView.bounces = true scrollView.bouncesZoom = true // Also, if you have double tap recognizer, // remember to add it scrollView.removeGestureRecognizer(doubleTapGestureRecognizer) }

Tenga en cuenta que doubleTapGestureRecognizer debe ser una variable de instancia. Debería ser similar a:

private lazy var doubleTapGestureRecognizer: UITapGestureRecognizer = { let doubleTapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleDoubleTap(_:))) doubleTapGestureRecognizer.numberOfTapsRequired = 2 doubleTapGestureRecognizer.delegate = self return doubleTapGestureRecognizer }() @objc private func handleDoubleTap(_ recognizer: UITapGestureRecognizer) { //scrollView.setZoomScale((scrollView.zoomScale > scrollView.minimumZoomScale) ? scrollView.minimumZoomScale : scrollView.maximumZoomScale, animated: true) if scrollView.zoomScale > scrollView.minimumZoomScale { scrollView.setZoomScale(scrollView.minimumZoomScale, animated: true) } else { let touchLocation = recognizer.location(in: recognizer.view) scrollView.zoom(to: CGRect(origin: touchLocation, size: CGSize(width: 22.0, height: 20.0)), animated: true) } }


Compruebe la configuración de minimumZoomScale y maximumZoomScale ; De acuerdo con los documentos :

maximumZoomScale debe ser mayor que minimumZoomScale para habilitar el zoom.

Por lo tanto, establecer los valores para que sean los mismos debe deshabilitar el zoom.


He intentado establecer las propiedades minimumZoomScale y maximumZoomScale de UIScrollView en 1 o la propiedad UIView de UIView en false o devolver nil en viewForZooming(in:) de UIScrollViewDelegate pero ninguna ha funcionado. En mi caso, después de varios intentos de prueba y error, lo siguiente funciona en mi caso [Probado en iOS 10.3]:

class MyViewController: UIViewController { var webView: WKWebView? override viewDidLoad() { super.viewDidLoad() //... self.webView.scrollView.delegate = self //... } } extension MyViewController: UIScrollViewDelegate { func scrollViewWillBeginZooming(_ scrollView: UIScrollView, with view: UIView?) { scrollView.pinchGestureRecognizer?.isEnabled = false } }


Sé que esta es una pregunta muy antigua, pero hice una pequeña variación para mis propósitos.

Quería poder decir fácilmente si el zoom se habilitó / deshabilitó sin tener que recurrir a una comparación entre scrollView.minimumZoomScale == scrollView.maximumZoomScale , que posiblemente no refleje si el zoom realmente se activó / deshabilitó.

Así que hice esto

// .h @property (assign, nonatomic, getter=isZoomEnabled) BOOL zoomEnabled; // .m @synthesize zoomEnabled = _zoomEnabled; - (void)setZoomEnabled:(BOOL)zoomEnabled; { _zoomEnabled = zoomEnabled; UIScrollView *scrollView = self.scrollView; if (zoomEnabled) { scrollView.minimumZoomScale = self.minimumZoomScale; scrollView.maximumZoomScale = self.maximumZoomScale; } else { scrollView.minimumZoomScale = 0.0f; scrollView.maximumZoomScale = 0.0f; } }

Los valores de self.minimumZoomScale y self.maximumZoomScale se establecen en el momento en que se configura UIScrollView .

Esto me da la capacidad de establecer / preguntar si el zoom está habilitado.

myViewController.zoomEnabled = YES; myViewController.isZoomEnabled;


Si desea desactivar solo el zoom con un gesto de pellizco, el código siguiente funciona.

scrollView.pinchGestureRecognizer?.requireGestureRecognizerToFail(scrollView.panGestureRecognizer)


Si desea deshabilitar la capacidad del usuario para acercarse mediante gestos, en iOS 5 y superior puede desactivar el gesto de pellizco. Esto aún le permite controlar la vista de desplazamiento desde el código ...

scrollView.pinchGestureRecognizer.enabled = NO;

similarmente para pan ...

scrollView.panGestureRecognizer.enabled = NO;

Esto debe - (void)viewDidAppear:(BOOL)animated en - (void)viewDidAppear:(BOOL)animated o más tarde, ya que de lo contrario el sistema lo restablece a habilitado.


Siguiendo los consejos anteriores de fbrereto, creé dos funciones lockZoom y unlockZoom. Al bloquear Zoom, copié mis escalas de zoom máx. Y mín. En variables, luego establecí las escalas de zoom máximo y mínimo en 1.0. Desbloquear el zoom solo invierte el proceso.

-(void)lockZoom { maximumZoomScale = self.scrollView.maximumZoomScale; minimumZoomScale = self.scrollView.minimumZoomScale; self.scrollView.maximumZoomScale = 1.0; self.scrollView.minimumZoomScale = 1.0; } -(void)unlockZoom { self.scrollView.maximumZoomScale = maximumZoomScale; self.scrollView.minimumZoomScale = minimumZoomScale; }


También puede devolver "nil" como vista de acercamiento en UIScrollViewDelegate:

- (UIView *) viewForZoomingInScrollView:(UIScrollView *) scrollView { return canZoom?view:nil; }


aquí, mi solución para detener el zoom en scrollview.

self.scrollView.minimumZoomScale=self.scrollView.maximumZoomScale;