Estoy actualizando mi aplicación iOS para reemplazar UIWebView
con WKWebView
. Sin embargo, no entiendo cómo lograr el mismo comportamiento con WKWebView
. Con UIWebView
solía scalesPageToFit
asegurarme de que la página web se mostrara con el mismo tamaño que el tamaño de la pantalla (para que aparezca en pantalla completa sin desplazarse).
Encontré esa solución en la web, sin embargo, no funciona:
- (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];
}
NSString* js = @"var meta = document.createElement('meta'); " "meta.setAttribute( 'name', 'viewport' ); " "meta.setAttribute( 'content', 'width = device-width' ); " "document.getElementsByTagName('head')[0].appendChild(meta)"; [webView stringByEvaluatingJavaScriptFromString: js];
reemplace su código con el código anterior.Respuestas:
también puede probar el WKUserScript.
aquí está mi configuración de trabajo:
NSString *jScript = @"var meta = document.createElement('meta'); meta.setAttribute('name', 'viewport'); meta.setAttribute('content', 'width=device-width'); document.getElementsByTagName('head')[0].appendChild(meta);"; WKUserScript *wkUScript = [[WKUserScript alloc] initWithSource:jScript injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES]; WKUserContentController *wkUController = [[WKUserContentController alloc] init]; [wkUController addUserScript:wkUScript]; WKWebViewConfiguration *wkWebConfig = [[WKWebViewConfiguration alloc] init]; wkWebConfig.userContentController = wkUController; wkWebV = [[WKWebView alloc] initWithFrame:self.view.frame configuration:wkWebConfig];
puede agregar configuración adicional a su WKWebViewConfiguration.
fuente
WKUserScriptInjectionTimeAtDocumentEnd
aWKUserScriptInjectionTimeAtDocumentStart
, no me funciona. No agrega este script. ¿cualquier razón?var style = document.createElement('style');style.innerHTML = 'body { -webkit-text-size-adjust: none; }';document.getElementsByTagName('head')[0].appendChild(style);
Eco de la respuesta de nferocious76, en código swift: versión Swift2.x
let jscript = "var meta = document.createElement('meta'); meta.setAttribute('name', 'viewport'); meta.setAttribute('content', 'width=device-width'); document.getElementsByTagName('head')[0].appendChild(meta);" let userScript = WKUserScript(source: jscript, injectionTime: WKUserScriptInjectionTime.AtDocumentEnd, forMainFrameOnly: true) let wkUController = WKUserContentController() wkUController.addUserScript(userScript) let wkWebConfig = WKWebViewConfiguration() wkWebConfig.userContentController = wkUController let youWebView = WKWebView(frame: CGRectZero, configuration: wkWebConfig)
versión swift3
let jscript = "var meta = document.createElement('meta'); meta.setAttribute('name', 'viewport'); meta.setAttribute('content', 'width=device-width'); document.getElementsByTagName('head')[0].appendChild(meta);" let userScript = WKUserScript(source: jscript, injectionTime: .atDocumentEnd, forMainFrameOnly: true) let wkUController = WKUserContentController() wkUController.addUserScript(userScript) let wkWebConfig = WKWebViewConfiguration() wkWebConfig.userContentController = wkUController let yourWebView = WKWebView(frame: self.view.bounds, configuration: wkWebConfig)
fuente
Similar a @ nferocious76 pero en lenguaje Swift
var scriptContent = "var meta = document.createElement('meta');" scriptContent += "meta.name='viewport';" scriptContent += "meta.content='width=device-width';" scriptContent += "document.getElementsByTagName('head')[0].appendChild(meta);" webView.evaluateJavaScript(scriptContent, completionHandler: nil)
fuente
Versión C #, para usar en Xamarin Custom Renderer:
string jScript = @"var meta = document.createElement('meta'); meta.setAttribute('name', 'viewport'); meta.setAttribute('content', 'width=device-width'); document.getElementsByTagName('head')[0].appendChild(meta);"; WKUserScript wkUScript = new WKUserScript((NSString)jScript, WKUserScriptInjectionTime.AtDocumentEnd, true); WKUserContentController wkUController = new WKUserContentController(); wkUController.AddUserScript(wkUScript); WKWebViewConfiguration wkWebConfig = new WKWebViewConfiguration(); wkWebConfig.UserContentController = wkUController; WKWebView webView=new WKWebView(Frame, wkWebConfig);
fuente
WkWebViewRenderer
? PorqueControl
así comoSetNativeControl()
son desconocidos ...ViewRenderer<CustomWebView, WKWebView>
y usarOnElementChanged(ElementChangedEventArgs<CustomWebView> e)
.Me di cuenta de debajo del alma. Para hacer que el contenido se ajuste al tamaño del dispositivo.
func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) { for making the content to fit with the device size let jscript = "var meta = document.createElement('meta'); meta.setAttribute('name', 'viewport'); meta.setAttribute('content', 'width=device-width'); document.getElementsByTagName('head')[0].appendChild(meta);" webView.evaluateJavaScript(jscript) }
fuente
Agregar lo siguiente a mi script HTML me ayudó.
<meta name="viewport" content="width=device-width, shrink-to-fit=YES">
Hace lo mismo que scalePageToFit en UIWebView.
consulte: Cómo configurar la escala de zoom de iOS WkWebview
fuente
Solución Swift 5:
let javaScript = """ var meta = document.createElement('meta'); meta.setAttribute('name', 'viewport'); meta.setAttribute('content', 'width=device-width'); document.getElementsByTagName('head')[0].appendChild(meta); """ webView.evaluateJavaScript(javaScript)
fuente
Este trabajo para mí, agregué dos atributos en meta:,
initial-scale=1.0, shrink-to-fit=yes
que ayudan a ajustar el texto con html a tener una imagen grande en html.let jscript = "var meta = document.createElement('meta'); meta.setAttribute('name', 'viewport'); meta.setAttribute('content', 'width=device-width, initial-scale=1.0, shrink-to-fit=yes'); document.getElementsByTagName('head')[0].appendChild(meta);" let userScript = WKUserScript(source: jscript, injectionTime: .atDocumentEnd, forMainFrameOnly: true) let wkUController = WKUserContentController() wkUController.addUserScript(userScript) let wkWebConfig = WKWebViewConfiguration() wkWebConfig.userContentController = wkUController self.webView = WKWebView(frame: self.view.bounds, configuration: wkWebConfig)
fuente
// 100% trabajo para mi
func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) { //print(#function) let scriptFontSizeAdjustment = "var style = document.createElement('style');style.innerHTML = 'body { -webkit-text-size-adjust: none; }';document.getElementsByTagName('head')[0].appendChild(style);" let scriptImgSizeAdjustment = "var style = document.createElement('style');style.innerHTML = 'img { display: inline;height: auto;max-width: 100%; }';document.getElementsByTagName('head')[0].appendChild(style);" webKitView.evaluateJavaScript(scriptFontSizeAdjustment) webKitView.evaluateJavaScript(scriptImgSizeAdjustment) }
fuente
Ninguna de estas respuestas me funcionó. Estaba intentando abrir una URL de Amazon para un artista en particular. Resulta que Amazon tiene una URL de respuesta móvil y una URL de escritorio. En Safari de escritorio, cambié a iPhone como agente de usuario (Desarrollar> Agente de usuario> Safari - iOS 13.1.3 - iPhone) y obtuve la URL adecuada para dispositivos móviles.
fuente