undeclared type support previous delegate broken before ios webkit ios8 wkwebview

ios - type - Deshabilitar el gesto de ampliación en WKWebView



wkwebview load url (17)

Estoy buscando una manera de deshabilitar el gesto de ampliación "pellizcar para ampliar" en la implementación de iOS de WKWebView. Hay una propiedad BOOL de ampliación disponible para OS X, pero no parece estar disponible en iOS.

WKWebView.h

#if !TARGET_OS_IPHONE /* @abstract A Boolean value indicating whether magnify gestures will change the web view''s magnification. @discussion It is possible to set the magnification property even if allowsMagnification is set to NO. The default value is NO. */ @property (nonatomic) BOOL allowsMagnification;

También he intentado mirar los reconocedores de gestos de WKWebView, pero parece que se está convirtiendo en una matriz vacía. Supongo que los reconocedores reales están más arraigados en la estructura del componente (bastante complejo por su aspecto) y preferirían no ir a excavarlos si es posible.

Sé de posibles hacks que potencialmente podrían inhabilitar el gesto de disparar (pasar gestos de forma selectiva a WebView, agregar una vista secundaria para capturar el gesto de pellizco, etc.) pero siempre he encontrado que estos introducen un retraso en el evento y desean mantener la implementación como Limpiar / hackear libre como sea posible.


Desactive la doble pulsación para acercar el gesto, ya que requiere un fallo del reconocedor de gestos. Evitará que el navegador tome medidas cuando el usuario haga doble clic.

import UIKit class DisableDoubleTapRecognizer : UITapGestureRecognizer, UIGestureRecognizerDelegate{ override init(target: Any?, action: Selector?) { super.init(target: target, action: action) } init() { super.init(target:nil, action: nil) self.numberOfTapsRequired = 2; self.delegate = self; } func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRequireFailureOf otherGestureRecognizer: UIGestureRecognizer) -> Bool { return true; } } //in your view controller override func viewDidLoad() { super.viewDidLoad() webView.addGestureRecognizer(DisableDoubleTapRecognizer()) }


En caso de que muestres un html local, simplemente puedes modificar este html y poner esta etiqueta meta en tu html:

<head> <meta content=''width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0'' name=''viewport'' /> </head>


Esto funcionó para mí. https://gist.github.com/paulofierro/5b642dcde5ee9e86a130

let source: String = "var meta = document.createElement(''meta'');" + "meta.name = ''viewport'';" + "meta.content = ''width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no'';" + "var head = document.getElementsByTagName(''head'')[0];" + "head.appendChild(meta);"; let script: WKUserScript = WKUserScript(source: source, injectionTime: .atDocumentEnd, forMainFrameOnly: true) let userContentController: WKUserContentController = WKUserContentController() let conf = WKWebViewConfiguration() conf.userContentController = userContentController userContentController.addUserScript(script) let webView = WKWebView(frame: CGRect.zero, configuration: conf)


He intentado establecer las propiedades minimumZoomScale y maximumZoomScale de UIScrollView en 1 o la propiedad isMultipleTouchEnabled de UIView en false o devolver nil desde invocar viewForZooming(in:) de UIScrollViewDelegate pero ninguno funcionó. En mi caso, después de varias pruebas y errores, 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 } }


La aplicación en la que trabajo necesitaba la vista para ser ampliada por Javascript. La respuesta aceptada también bloquea el zoom por JavaScript desde dentro de la página. Solo necesitaba deshabilitar el gesto de pellizco por parte del usuario de la aplicación. La única solución que he encontrado es deshabilitar el gesto de la vista web después de que la página se haya cargado:

- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation { /* disable pinch gesture recognizer to allow zooming the web view by code but prevent zooming it by the user */ for (UIGestureRecognizer *gr in self.webView.scrollView.gestureRecognizers) { if ([gr isKindOfClass:[UIPinchGestureRecognizer class]]) { gr.enabled = NO; } } }


La siguiente respuesta ya no funciona en iOS 10 beta.

Para mejorar la accesibilidad en los sitios web de Safari, los usuarios ahora pueden pellizcar para hacer zoom incluso cuando un sitio web establece una escala de usuario = no en la ventana gráfica.

WKWebView parece respetar la metaetiqueta de viewport de la misma manera que lo hace Mobile Safari (como es de esperar). Entonces, encontré la inyección de esa etiqueta en el DOM a través de javascript después de que una carga de página haga el truco. Estaría cansado de esta solución a menos que sepa exactamente qué HTML se está cargando en la vista web, de lo contrario sospecho que tendría consecuencias no deseadas. En mi caso, estoy cargando cadenas HTML, así que solo puedo agregarlo al HTML que envío con la aplicación.

Para hacerlo de forma genérica para cualquier página web:

- (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation { NSString *javascript = @"var meta = document.createElement(''meta'');meta.setAttribute(''name'', ''viewport'');meta.setAttribute(''content'', ''width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no'');document.getElementsByTagName(''head'')[0].appendChild(meta);"; [webView evaluateJavaScript:javascript completionHandler:nil]; }

Podría ser prudente echar un vistazo a qué tipo de navegación se acaba de completar, ya que solo una nueva página necesitará este javascript ejecutado.


Las soluciones nativas no funcionaban para mí, y inyectar JS no es lo ideal. Noté que cuando se produce un zoom y se llama a mi delegado, pinchGestureRecognizer se habilita aunque lo deshabilité al inicializar la vista web. Para solucionar este problema, lo deshabilito cada vez que se inicia un zoom:

extension ViewController: UIScrollViewDelegate { // disable zooming in webview func scrollViewWillBeginZooming(_ scrollView: UIScrollView, with view: UIView?) { scrollView.pinchGestureRecognizer?.isEnabled = false } }


Necesitamos cambiar la llamada de delegado con las siguientes firmas en XCode 8:

anular func viewForZooming (en scrollView: UIScrollView) -> UIView? {return nil}


No tengo suficiente reputación para agregar comentarios a las respuestas, pero quería mencionar que la solución de Kevin (meta viewport) ya no funciona en iOS 10 beta. Sin embargo, la solución de Landschaft está funcionando para mí.

Dado que la solución JS utiliza los estándares W3C, siempre debe ser compatible.

Ah, Kevin, desearía que así funcionaran estas cosas.

Más aquí: https://.com/a/37859168/1389714


Puede evitar que los usuarios hagan zoom al configurar el delegado de UIScrollView de su WKWebKit e implementar viewForZooming(in:) como se viewForZooming(in:) continuación:

class MyClass { let webView = WKWebView() init() { super.init() webView.scrollView.delegate = self } deinit() { // Without this, it''ll crash when your MyClass instance is deinit''d webView.scrollView.delegate = nil } } extension MyClass: UIScrollViewDelegate { func viewForZooming(in scrollView: UIScrollView) -> UIView? { return nil } }


Puedes usar UIScrollViewDelegate para esto. Primero asigne un delegado a su vista web en viewDidLoad () o cualquier otro método adecuado como:

class LoginViewController: UIViewController, WKUIDelegate, UIScrollViewDelegate { override func viewDidLoad() { webView.scrollView.delegate = self } //And add this delegate method in your controller: func scrollViewWillBeginZooming(_ scrollView: UIScrollView, with view: UIView?) { scrollView.pinchGestureRecognizer?.isEnabled = false scrollView.panGestureRecognizer.isEnabled = false } }


Si la vista web es usuario solo para fines de lectura, es decir, solo para mostrar el uso del contenido web

webView.isUserInteractionEnabled = false

Por esto el gesto de zoom no funcionará en él.


Si no es importante que maneje los enlaces dentro de html (digamos que solo desea mostrar texto), lo más simple sería desactivar la interacción del usuario webView.userInteractionEnabled = false


Versión completa de Swift 3 / iOS 10 de la respuesta de Landschaft:

import UIKit import WebKit class MyViewController: UIViewController, UIScrollViewDelegate { var webView = WKWebView() override func viewDidLoad() { super.viewDidLoad() self.view.addSubview(webView) webView.scrollView.delegate = self } // Disable zooming in webView func viewForZooming(in: UIScrollView) -> UIView? { return nil; } }


así es como deshabilité el zoom para el controlador de vista Swift3 para una aplicación solo para webview

import UIKit import WebKit class ViewController: UIViewController, WKNavigationDelegate, UIScrollViewDelegate { @IBOutlet var webView: WKWebView! override func loadView() { webView = WKWebView() webView.navigationDelegate = self view = webView } override func viewDidLoad() { super.viewDidLoad() webView.scrollView.delegate = self } func viewForZooming(in: UIScrollView) -> UIView? { return nil; } }


Código de trabajo completo para deshabilitar el zoom en WkWebView en swift

importar UIKit importar WebKit

clase ViewController: UIViewController, WKUIDelegate {

// @IBOutlet var eventWkWebView: WKWebView! var webView : WKWebView! override func loadView() { let webConfiguration = WKWebViewConfiguration() webView = WKWebView(frame: .zero, configuration:webConfiguration) webView.uiDelegate = self let source: String = "var meta = document.createElement(''meta'');" + "meta.name = ''viewport'';" + "meta.content = ''width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no'';" + "var head = document.getElementsByTagName(''head'')[0];" + "head.appendChild(meta);"; let script: WKUserScript = WKUserScript(source: source, injectionTime: .atDocumentEnd, forMainFrameOnly: true) webView.configuration.userContentController.addUserScript(script) view = webView } override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. // view.addSubview(eventWkWebView) let myUrl = URL(string: "https://www.google.com") let myRequest = URLRequest(url: myUrl!) webView.load(myRequest) }

}


Swift 2.0

extension WKWebView { func viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView? { return nil } }