禁用放大WKWebView?

Baz*_*ley 4 iphone xcode ios swift

有没有人知道在WKWebView中禁用双击和缩放缩放的简单方法?我没有尝试过任何工作:

Webview.scrollView.allowsMagnification = false;    // Error: value of type WKWebView has no member allowsMagnification

Webview.scrollView.isMultipleTouchEnabled = false; // doesn't do anything
Run Code Online (Sandbox Code Playgroud)

在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
Run Code Online (Sandbox Code Playgroud)

pri*_*001 47

您必须在脚本中添加最大比例.

以下代码可以帮助您:

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)
Run Code Online (Sandbox Code Playgroud)

  • 如果您已经有一个webView实例,只需用`webView.configuration.userContentController.addUserScript(script)替换最后5行. (6认同)

Dro*_*ris 15

好的,这就是我解决这个问题的方法:

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)
}   
Run Code Online (Sandbox Code Playgroud)


Ahm*_*tfy 11

斯威夫特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
}
Run Code Online (Sandbox Code Playgroud)

  • 这对我来说非常合适,但仍然启用了双击缩放,我还没有找到一个好方法来删除它. (5认同)
  • 不太有效。当用户聚焦文本字段时,Web 视图会放大。然后用户就无法缩小...... (2认同)

Saú*_*ril 7

网页解决方案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];
}];
Run Code Online (Sandbox Code Playgroud)

这段代码应该可以工作,但我建议始终在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
    }
}
Run Code Online (Sandbox Code Playgroud)