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