禁用WKWebView的缩放



有没有人知道一个简单的方法来禁用双击和缩放在WKWebView?我试过的都不奏效:

Webview.scrollView.allowsMagnification = false;    // Error: value of type WKWebView has no member allowsMagnification
Webview.scrollView.isMultipleTouchEnabled = false; // doesn't do anything

在html:

<meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width, height=device-height, target-densitydpi=device-dpi" /> // pile of crap, does nothing

您必须在脚本中添加最大缩放

下面的代码可以帮助你:
let source: String = "var meta = document.createElement('meta');" +
    "meta.name = 'viewport';" +
    "meta.content = 'width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no';" +
    "var head = document.getElementsByTagName('head')[0];" +
    "head.appendChild(meta);"
let script: WKUserScript = WKUserScript(source: source, injectionTime: .atDocumentEnd, forMainFrameOnly: true)
let userContentController: WKUserContentController = WKUserContentController()
let conf = WKWebViewConfiguration()
conf.userContentController = userContentController
userContentController.addUserScript(script)
let webView = WKWebView(frame: CGRect.zero, configuration: conf)

我是这样解决的:

wkWebView.configuration.userContentController.addUserScript(self.getZoomDisableScript()) 
private func getZoomDisableScript() -> WKUserScript {
    let source: String = "var meta = document.createElement('meta');" +
        "meta.name = 'viewport';" +
        "meta.content = 'width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no';" +
        "var head = document.getElementsByTagName('head')[0];" + "head.appendChild(meta);"
    return WKUserScript(source: source, injectionTime: .atDocumentEnd, forMainFrameOnly: true)
}   

Swift 4:

@IBOutlet weak var webView: WKWebView!
override func viewDidLoad() {
         super.viewDidLoad()
         self.webView.scrollView.delegate = self
}
//MARK: - UIScrollViewDelegate
func scrollViewWillBeginZooming(_ scrollView: UIScrollView, with view: UIView?) {
         scrollView.pinchGestureRecognizer?.isEnabled = false
}

网页解决方案1

这篇文章解释了如何管理缩放。

WebKit: iOS 10中的新交互行为

iOS 10 "ignoresViewportScaleLimits"属性被添加到WKWebViewConfiguration,默认为false。该帖子建议设置为true并正确管理页面的缩放。

注意:在Safari和SafariViewController中,这个属性的值默认为true。

在我的情况下,我想在某些情况下重置缩放。对此,我发现的独特方法是将最大刻度更改为1.0,然后更改为10.0。

NSString* js =
    @"var meta = document.createElement('meta'); " 
    "meta.setAttribute( 'name', 'viewport' ); " 
    "meta.setAttribute( 'content', 'width = device-width, initial-scale = 1.0, minimum-scale = 1.0, maximum-scale = 1.0, user-scalable = yes' ); " 
    "document.getElementsByTagName('head')[0].appendChild(meta)";
[_wkWebview evaluateJavaScript:js completionHandler:^(id _Nullable object, NSError * _Nullable error) {
    NSString* js =
    @"var meta = document.createElement('meta'); " 
    "meta.setAttribute( 'name', 'viewport' ); " 
    "meta.setAttribute( 'content', 'width = device-width, initial-scale = 1.0, minimum-scale = 1.0, maximum-scale = 10.0, user-scalable = yes' ); " 
    "document.getElementsByTagName('head')[0].appendChild(meta)";
    [_wkWebview evaluateJavaScript:js completionHandler:nil];
}];

这段代码应该可以工作,但我建议创建"viewport"总是在html中,并在javascript中创建一个函数(即resetZoom或disableZoom),直接从objective-C调用它(它更干净)

我希望这对你有帮助。

文件URL

解决方案2

重写滚动视图委托:

class ViewController: UIViewController {
    let webView = WKWebView()
    
    init() {
        super.init()
        webView.scrollView.delegate = self
    }
    
    deinit() {
        // To prevent crash when ViewController is deinitialized
        webView.scrollView.delegate = nil
    }
}
extension ViewController: UIScrollViewDelegate {
    func viewForZooming(in scrollView: UIScrollView) -> UIView? {
        return nil
    }
}

iOS 13

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);";
// you should use WKUserScript, `evaluateJavaScript` is not working
WKUserScript *us = [[WKUserScript alloc] initWithSource:javascript injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];[wkWebView.configuration.userContentController addUserScript:us];

不工作

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
    return nil;
}
- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view {
    scrollView.pinchGestureRecognizer.enabled = NO;
}

找不到一种合适的方法来完全禁用双击缩放,但这里有一个解决方案,足以满足我的用例:

private var zoomScale: CGFloat? = nil
func scrollViewWillBeginZooming(_ scrollView: UIScrollView, with view: UIView?) {
    zoomScale = scrollView.zoomScale
    // And use the same solution to prevent pinch to zoom as in other answers
    scrollView.pinchGestureRecognizer?.isEnabled = false
}
    
func scrollViewDidZoom(_ scrollView: UIScrollView) {
    if let originalScale = zoomScale {
        scrollView.zoomScale = originalScale
    }
}

它只是在缩放开始前存储缩放刻度,然后在缩放完成后立即重置它,导致只有一点移动。

最新更新