提问者:小点点

在WKWebView中禁用放大手势


我正在寻找一种方法来禁用 WKWebView 的 iOS 实现上的“捏合缩放”放大手势。有一个可用于OS X的放大BOOL属性,但它似乎在iOS上不可用。

WKWebView.h

#if !TARGET_OS_IPHONE
/* @abstract A Boolean value indicating whether magnify gestures will
 change the web view's magnification.
 @discussion It is possible to set the magnification property even if
 allowsMagnification is set to NO.
 The default value is NO.
 */
@property (nonatomic) BOOL allowsMagnification;

我也尝试过查看WKWebView的手势识别器,但似乎发现了一个空数组。我假设实际的识别器埋在组件结构的更深处(从外观上看相当复杂),如果可能的话,我宁愿不去挖掘它们。

我知道可能的黑客可能会禁用手势触发(有选择地将手势传递到 WebView,添加子视图以捕获捏合手势等),但我总是发现这些会在事件中引入滞后,并希望保持实现尽可能干净/无黑客攻击。


共3个答案

匿名用户

您可以通过设置WKWebKit的UIScrollView的委托,并按如下方式实现viewForZooming(in:),防止用户缩放:

class MyClass {
    let webView = WKWebView()

    init() {
        super.init()
        webView.scrollView.delegate = self
    }

    deinit() {
        // Without this, it'll crash when your MyClass instance is deinit'd
        webView.scrollView.delegate = nil
    }
}

extension MyClass: UIScrollViewDelegate {
    func viewForZooming(in scrollView: UIScrollView) -> UIView? {
        return nil
    }
}

匿名用户

我尝试将UIScrollView的minimumZoomScale和maximumZoomScale属性设置为1UIViewisMultipleTouchEnabled属性设置为false或从调用UIScrollViewDelegateviewForZooming(in:)返回nil,但没有一个有效。就我而言,经过多次试验和错误,以下内容适用于我的情况[在iOS 10.3上测试]:

class MyViewController: UIViewController {
   var webView: WKWebView?

   override viewDidLoad() {
      super.viewDidLoad()

      //...
      self.webView.scrollView.delegate = self
      //...
   }
}

extension MyViewController: UIScrollViewDelegate { 
   func scrollViewWillBeginZooming(_ scrollView: UIScrollView, with view: UIView?) {
      scrollView.pinchGestureRecognizer?.isEnabled = false
   }
}

匿名用户

以下回答在iOS 10测试版中不再有效。

为了提高Safari中网站的可访问性,即使网站在视口中设置userscalable=no,用户现在也可以进行缩放。

WKWebView似乎和Mobile Safari一样尊重viewport meta标签(正如所料)。因此,我发现在页面加载之后通过javascript将该标签注入到DOM中是可行的。我会厌倦这种解决方案,除非你确切地知道什么HTML被加载到webview,否则我怀疑它会有意想不到的后果。在我的例子中,我正在加载HTML字符串,所以我可以将它添加到应用程序附带的HTML中。

要为任何网页执行常规操作:

- (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, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no');document.getElementsByTagName('head')[0].appendChild(meta);";
    
    [webView evaluateJavaScript:javascript completionHandler:nil];
}

看看刚刚完成了什么样的导航可能是明智的,因为只有一个新页面需要执行这个javascript。