UIWebView의 scalesPageToFit에 해당하는 WKWebView


96

나는 대체 할 내 iOS 앱 업데이트하고 UIWebView과를 WKWebView. 그러나 나는 WKWebView. 으로 UIWebView내가 사용하는 scalesPageToFit웹 PAG는 화면 크기와 같은 크기로 표시했다 확인하기 위해 (때문에 같은 스크롤없이 전체 화면을 표시합니다).

웹에서 그 솔루션을 찾았지만 작동하지 않습니다.

- (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에 존재하지 않아서 내 evaluationJavaScript : completionHandler 호출을 유지했습니다
olinsha

1
해결책을 얻었습니까?
anoop4real

답변:


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작동하지 않습니다. 이 스크립트를 추가하지 않습니다. 어떤 이유?
Mahesh K

2
좋은 대답이지만 웹킷 자체적으로 글꼴 크기를 변경하지 않도록이 스크립트를 추가합니다.var style = document.createElement('style');style.innerHTML = 'body { -webkit-text-size-adjust: none; }';document.getElementsByTagName('head')[0].appendChild(style);
José Manuel Sánchez

1
이것은 훌륭하게 작동했습니다. 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 글꼴 크기를 더 크게 만드는 내 문제를 해결하고 작은 것에서 큰 것으로 새로 고치지 않았습니다. 나는 이것을 사용하여 콘텐츠 글꼴 크기와 내부 레이아웃을 "새로 고침"합니다.
Nadi Hassan

12

Xamarin Custom Renderer에서 사용하기위한 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);

매력처럼 일하세요!
Divyesh_08

커스텀 렌더러는 어떻게 생겼습니까? 당신은에서 상속 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

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했습니다.

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

이 답변 중 어느 것도 나를 위해 일하지 않았습니다. 특정 아티스트의 Amazon URL을 열려고했습니다. Amazon에는 모바일 응답 URL과 데스크톱 URL이 있습니다. 데스크톱 Safari에서 iPhone으로 사용자 에이전트 (개발> 사용자 에이전트> Safari-iOS 13.1.3-iPhone)로 변경하고 적절한 모바일 URL을 얻었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.