Equivalente di WKWebView per scalesPageToFit di UIWebView


92

Sto aggiornando la mia app iOS per sostituirla UIWebViewcon WKWebView. Tuttavia non capisco come ottenere lo stesso comportamento con WKWebView. Con UIWebViewmi scalesPageToFitassicuravo che la pagina web fosse visualizzata con le stesse dimensioni dello schermo (in modo da apparire a schermo intero senza scorrere).

Ho trovato quella soluzione sul web ma non funziona:

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

prova questo: 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];sostituisci il tuo codice con il codice sopra.
z22

Ho provato ma ho lo stesso risultato (a proposito, il metodo stringByEvaluatingJavaScriptFromString non esiste in WKWebView, quindi ho mantenuto la mia chiamata
assessJavaScript

1
hai trovato una soluzione?
anoop4real

Risposte:


126

puoi anche provare WKUserScript.

ecco la mia configurazione di lavoro:

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

puoi aggiungere una configurazione aggiuntiva alla tua WKWebViewConfiguration.


2
Funziona come un fascino. Grazie
Nithin Pai

2
Funziona alla grande per me - solo un piccolo aggiustamento stava cambiando WKUserScriptInjectionTimeAtDocumentEnd in WKUserScriptInjectionTimeAtDocumentStart
sckor

1
Se cambio WKUserScriptInjectionTimeAtDocumentEnda WKUserScriptInjectionTimeAtDocumentStartallora non funziona per me. Non aggiunge questo script. qualche ragione?
Mahesh K

2
Bella risposta, ma aggiungerei anche questo script per evitare che il webkit cambi da solo le dimensioni dei caratteri:var style = document.createElement('style');style.innerHTML = 'body { -webkit-text-size-adjust: none; }';document.getElementsByTagName('head')[0].appendChild(style);
José Manuel Sánchez

1
Ha funzionato alla grande. Stavo cercando di allineare un titolo speciale con il layout automatico utilizzando WKWebView. L'altezza dell'elemento da offsetHeight continuava a tornare troppo grande finché non ho aggiunto questo script. Grazie per l'aiuto.
JamWils

44

Eco della risposta di nferocious76, in codice swift: versione 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)

versione 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)

20

Simile a @ nferocious76 ma in linguaggio 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)

Grazie! questo ha anche risolto il mio problema di aumentare la dimensione del carattere html, senza aggiornare da piccolo a grande. Lo sto usando per "aggiornare" la dimensione del carattere del contenuto e il layout interno.
Nadi Hassan

12

Versione C #, da usare nel renderer personalizzato Xamarin:

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

Funziona come un fascino!
Divyesh_08

Come appare il renderer personalizzato? Tu erediti da WkWebViewRenderer? Perché Controlcosì come SetNativeControl()sono sconosciuti ...
test il

Ok, sembra che sia necessario ereditare da ViewRenderer<CustomWebView, WKWebView>e utilizzare OnElementChanged(ElementChangedEventArgs<CustomWebView> e).
test il

8

Ho capito sotto l'anima. Per adattare il contenuto alle dimensioni 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)
}


1

Soluzione 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)

1

Questo lavoro per me, ho aggiunto due attributi in meta:, initial-scale=1.0, shrink-to-fit=yesche aiutano ad adattare il testo con html hanno un'immagine grande in 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)

0

// 100% funziona per me

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)

}

0

Nessuna di queste risposte funzionava per me. Stavo cercando di aprire un URL Amazon per un particolare artista. Si scopre che Amazon ha un URL reattivo per dispositivi mobili e un URL desktop. Su Safari desktop, sono passato a iPhone come user-agent (Develop> User Agent> Safari - iOS 13.1.3 - iPhone) e ho ottenuto l'URL appropriato per i dispositivi mobili.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.