UIWebView की तराजू के लिए WKWebView बराबर है


96

मैं बदलने के लिए अपने iOS एप्लिकेशन को अद्यतन करने कर रहा हूँ UIWebViewके साथ WKWebView। हालाँकि मुझे समझ नहीं आ रहा है कि उसी व्यवहार को कैसे प्राप्त किया जाए WKWebView। के साथ UIWebViewमैं इस्तेमाल कियाscalesPageToFit यह सुनिश्चित करने के लिए गया कि वेब पेज स्क्रीन आकार के समान प्रदर्शित हो (ताकि स्क्रॉल किए बिना पूर्ण स्क्रीन दिखाई दे)।

मैंने पाया कि वेब पर यह समाधान काम नहीं करता है:

- (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];अपने कोड को उपरोक्त कोड से बदलें।
Z22

मैं इसे एक कोशिश दे दी है, लेकिन मैं एक ही परिणाम है (वैसे, stringByEvaluatingJavaScriptFromString विधि WKWebView में मौजूद नहीं है इसलिए मैं अपने evaluateJavaScript रखा: completionHandler कॉल
olinsha

1
क्या आपको कोई समाधान मिला?
अनूप ४

जवाबों:


128

आप WKUserScript भी आज़मा सकते हैं।

यहाँ मेरा काम करने का विन्यास है:

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

आप अपने WKWebViewConfiguration पर अतिरिक्त कॉन्फ़िगरेशन जोड़ सकते हैं।


2
एक जादू की तरह काम करता है। धन्यवाद
नितिन पई

2
मेरे लिए बहुत अच्छा काम करता है - केवल मामूली ट्वीक WKUserScriptInjectionTimeAtDocumentEnd में बदल रहा था और WKUserScriptInjectionTimeAtDocumentStart
sckor

1
अगर मैं बदल WKUserScriptInjectionTimeAtDocumentEndजाता हूं WKUserScriptInjectionTimeAtDocumentStartतो यह मेरे लिए काम नहीं करता है। यह इस स्क्रिप्ट को नहीं जोड़ता है। कोई कारण?
महेश के

2
अच्छा जवाब है, लेकिन मैं इस स्क्रिप्ट को अपने आप से फ़ॉन्ट आकार बदलने से बचने के लिए वेबसाईट भी जोड़ दूंगा:var style = document.createElement('style');style.innerHTML = 'body { -webkit-text-size-adjust: none; }';document.getElementsByTagName('head')[0].appendChild(style);
जोस मैनुअल सेंचेज

1
इसने शानदार काम किया। मैं WKWebView का उपयोग करके ऑटो लेआउट के साथ एक विशेष शीर्षक संरेखित करने की कोशिश कर रहा था। जब तक मैंने इस स्क्रिप्ट को नहीं जोड़ा तब तक ऑफसेटहाइट से तत्व की ऊंचाई बहुत बड़ी थी। सहायता के लिए धन्यवाद।
जामविलास

44

Nferocious76 के उत्तर की गूंज, स्विफ्ट कोड में: 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)

स्विफ्ट 3 संस्करण

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

@ Nferocious76 के समान लेकिन स्विफ्ट भाषा में

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)

धन्यवाद! इससे html फ़ॉन्ट आकार बड़ा होने की मेरी समस्या भी हल हो गई, छोटे से बड़े तक ताज़ा नहीं हुई। मैं सामग्री फ़ॉन्ट आकार और आंतरिक लेआउट को "ताज़ा" करने के लिए इसका उपयोग कर रहा हूं।
नाडी हसन

12

ज़ामरीन कस्टम रेंडरर में उपयोग के लिए C # संस्करण:

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

आकर्षण जैसा काम!
दिव्येश_ ०

कस्टम रेंडरर कैसा दिखता है? क्या आपको विरासत में मिला है WkWebViewRenderer? क्योंकि Controlसाथ ही SetNativeControl()अज्ञात हैं ...
परीक्षण

ठीक है, ऐसा लगता है कि आपको विरासत ViewRenderer<CustomWebView, WKWebView>और उपयोग करने की आवश्यकता है OnElementChanged(ElementChangedEventArgs<CustomWebView> e)
परीक्षण

10

मैं आत्मा के नीचे का पता लगा लिया। डिवाइस आकार के साथ फिट होने के लिए सामग्री बनाने के लिए।

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

स्विफ्ट 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

मेरे लिए यह काम, मैंने मेटा में दो विशेषताएँ जोड़ीं: initial-scale=1.0, shrink-to-fit=yes , HTML के साथ फिट टेक्स्ट की मदद से 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% काम

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

इस जवाब में से कोई भी मेरे लिए काम नहीं कर रहा था। मैं एक विशेष कलाकार के लिए अमेज़न URL खोलने की कोशिश कर रहा था। यह बताता है कि अमेज़न में एक मोबाइल उत्तरदायी URL और एक डेस्कटॉप URL है। डेस्कटॉप सफारी पर, मैंने उपयोगकर्ता-एजेंट के रूप में आईफोन में बदलाव किया (डेवलपमेंट> यूजर एजेंट> सफारी - आईओएस 13.1.3 - आईफोन) और मोबाइल के लिए उपयुक्त यूआरएल मिला।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.