เทียบเท่า WKWebView สำหรับเครื่องชั่งของ UIWebView


97

ฉันกำลังอัปเดตแอป 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
คุณได้รับวิธีแก้ปัญหาหรือไม่?
anoop4real

คำตอบ:


128

คุณยังสามารถลองใช้ WKUserScript

นี่คือ config การทำงานของฉัน:

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
ใช้งานได้เหมือนมีเสน่ห์ ขอบคุณ
Nithin Pai

2
ใช้งานได้ดีสำหรับฉัน - มีเพียงการปรับแต่งเล็กน้อยเท่านั้นที่กำลังเปลี่ยน WKUserScriptInjectionTimeAtDocumentEnd เป็น WKUserScriptInjectionTimeAtDocumentStart
sckor

1
ถ้าฉันเปลี่ยนWKUserScriptInjectionTimeAtDocumentEndไปWKUserScriptInjectionTimeAtDocumentStartแล้วมันไม่ได้ผลสำหรับฉัน มันไม่ได้เพิ่มสคริปต์นี้ เหตุผลใด?
Mahesh K

2
คำตอบที่ดี แต่ฉันจะเพิ่มสคริปต์นี้เพื่อหลีกเลี่ยงไม่ให้ webkit เปลี่ยนขนาดตัวอักษรด้วยตัวเอง:var style = document.createElement('style');style.innerHTML = 'body { -webkit-text-size-adjust: none; }';document.getElementsByTagName('head')[0].appendChild(style);
José Manuel Sánchez

1
สิ่งนี้ได้ผลดี ฉันพยายามจัดตำแหน่งหัวเรื่องพิเศษด้วย Auto Layout โดยใช้ WKWebView ความสูงขององค์ประกอบจาก offsetHeight ยังคงกลับมาใหญ่เกินไปจนกระทั่งฉันเพิ่มสคริปต์นี้ ขอบคุณสำหรับความช่วยเหลือ
JamWils

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)

รุ่น 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

คล้ายกับ @ nferocious76 แต่เป็นภาษา 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)

ขอบคุณ! สิ่งนี้ยังแก้ปัญหาของฉันเพื่อทำให้ขนาดตัวอักษร html ใหญ่ขึ้นไม่ได้รีเฟรชจากเล็กไปใหญ่ ฉันกำลังใช้สิ่งนี้เพื่อ "รีเฟรช" ขนาดตัวอักษรของเนื้อหาและเค้าโครงด้านใน
นาดีฮัสซัน

12

เวอร์ชัน C # สำหรับใช้ใน 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);

ทำงานอย่างมีเสน่ห์!
Divyesh_08

ตัวแสดงผลแบบกำหนดเองมีลักษณะอย่างไร? สืบทอดมาจากWkWebViewRendererไหน? เนื่องจากไม่ทราบControlเช่นกันSetNativeControl()...
ทดสอบ

ตกลงมันก็ดูเหมือนว่าคุณจะต้องรับมรดกจากและการใช้งานViewRenderer<CustomWebView, WKWebView> OnElementChanged(ElementChangedEventArgs<CustomWebView> e)
ทดสอบ

11

ฉันคิดออกด้านล่างจิตวิญญาณ สำหรับการทำเนื้อหาให้เหมาะสมกับขนาดอุปกรณ์.

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

โซลูชัน 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

งานนี้สำหรับฉันฉันได้เพิ่มแอตทริบิวต์สองรายการในเมตา: 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 ของ Amazon สำหรับศิลปินคนใดคนหนึ่ง ปรากฎว่า Amazon มี URL ที่ตอบสนองต่ออุปกรณ์เคลื่อนที่และ URL บนเดสก์ท็อป บน Safari บนเดสก์ท็อปฉันเปลี่ยนเป็น iPhone เป็นตัวแทนผู้ใช้ (พัฒนา> ตัวแทนผู้ใช้> Safari - iOS 13.1.3 - iPhone) และได้รับ URL ที่เหมาะสมสำหรับมือถือ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.