WKWebView tương đương cho thang đo của UIWebViewPageToFit


92

Tôi đang cập nhật ứng dụng iOS của mình để thay thế UIWebViewbằng WKWebView. Tuy nhiên tôi không hiểu làm thế nào để đạt được hành vi tương tự với WKWebView. Với UIWebViewtôi đã sử dụng scalesPageToFitđể đảm bảo trang web được hiển thị với cùng kích thước với kích thước màn hình (để xuất hiện toàn màn hình mà không cần cuộn).

Tôi đã tìm thấy giải pháp đó trên web nhưng nó không hoạt động:

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

hãy thử điều này: 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];thay thế mã của bạn bằng mã trên.
z22

Tôi đưa cho nó một thử nhưng tôi có cùng một kết quả (bằng cách này, phương pháp stringByEvaluatingJavaScriptFromString không tồn tại trong WKWebView vì vậy tôi giữ evaluateJavaScript tôi: gọi completionHandler
olinsha

1
bạn đã nhận được một giải pháp?
anoop4real

Câu trả lời:


126

bạn cũng có thể thử WKUserScript.

đây là cấu hình làm việc của tôi:

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

bạn có thể thêm cấu hình bổ sung vào WKWebViewConfiguration của mình.


2
Hoạt động như một sự quyến rũ. Cảm ơn
Nithin Pai

2
Hoạt động tuyệt vời đối với tôi - chỉ một chỉnh sửa nhỏ đã thay đổi WKUserScriptInjectionTimeAtDocumentEnd thành WKUserScriptInjectionTimeAtDocumentStart
sckor

1
Nếu tôi thay đổi WKUserScriptInjectionTimeAtDocumentEndthành WKUserScriptInjectionTimeAtDocumentStartthì nó không hiệu quả với tôi. Nó không thêm tập lệnh này. bất kỳ lý do?
Mahesh K

2
Câu trả lời tuyệt vời, nhưng tôi cũng sẽ thêm tập lệnh này để tránh webkit tự thay đổi kích thước phông chữ:var style = document.createElement('style');style.innerHTML = 'body { -webkit-text-size-adjust: none; }';document.getElementsByTagName('head')[0].appendChild(style);
José Manuel Sánchez

1
Điều này làm việc tuyệt vời. Tôi đang cố gắng căn chỉnh một tiêu đề đặc biệt với Bố cục Tự động bằng WKWebView. Chiều cao của phần tử từ offsetHeight tiếp tục trở lại quá lớn cho đến khi tôi thêm tập lệnh này. Cảm ơn đã giúp đỡ.
JamWils

44

Tiếng vọng về câu trả lời của nferocious76, trong mã nhanh: phiên bả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)

phiên bả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)

20

Tương tự như @ nferocious76's nhưng bằng ngôn ngữ 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)

Cảm ơn! điều này cũng giải quyết vấn đề của tôi là làm cho kích thước phông chữ html trở nên lớn hơn, không làm mới từ nhỏ thành lớn. Tôi đang sử dụng cái này để "làm mới" kích thước phông chữ nội dung và bố cục bên trong.
Nadi Hassan

12

Phiên bản C #, để sử dụng trong Trình kết xuất tùy chỉnh 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);

Làm việc như mê!
Divyesh_08

Trình kết xuất tùy chỉnh trông như thế nào? Bạn có thừa kế từ WkWebViewRenderer? Bởi vì Controlcũng như SetNativeControl()chưa biết ...
kiểm tra

Ok có vẻ như bạn cần kế thừa ViewRenderer<CustomWebView, WKWebView>và sử dụng OnElementChanged(ElementChangedEventArgs<CustomWebView> e).
kiểm tra

8

Tôi đã tìm ra dưới đây soultion. Để làm cho nội dung phù hợp với kích thước thiết bị.

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

Giải pháp 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

Công việc này đối với tôi, tôi đã thêm hai thuộc tính trong meta : initial-scale=1.0, shrink-to-fit=yes, giúp văn bản phù hợp với html có hình ảnh lớn trong 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% làm việc cho tôi

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

Không có câu trả lời nào trong số này phù hợp với tôi. Tôi đang cố gắng mở một URL Amazon cho một nghệ sĩ cụ thể. Hóa ra là Amazon có URL đáp ứng trên thiết bị di động và URL trên máy tính để bàn. Trên Safari trên máy tính để bàn, tôi đã thay đổi thành tác nhân người dùng iPhone (Develop> User Agent> Safari - iOS 13.1.3 - iPhone) và nhận được URL thích hợp cho thiết bị di động.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.