在WKWebView中禁用放大手势

我正在寻找一种方法来禁用WKWebView的iOS实现上的“捏放大”放大手势。 有一个放大的BOOL属性可用于OS X,但它似乎并没有在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的手势识别器,但是这似乎正在变成一个空arrays。 我假设实际的识别器在组件结构中有更深层次的保护(相当复杂,看起来相当复杂),如果可能的话,宁愿不去挖掘它们。

我知道可能的黑客,可能会禁用手势发射(有select地传递手势到WebView,添加子视图捕捉捏手势等),但我总是发现那些引入滞后的事件,并希望保持实现尽可能干净/免费。

您可以通过设置WKWebKit的UIScrollView的委托并实现以下方法来防止用户缩放:

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

下面的答案不再适用于iOS 10 beta。

为了提高Safari中网站的可访问性,即使网站在视口中设置了user-scalable = no,用户也可以捏合缩放。


WKWebView似乎像移动Safari一样尊重视口元标记(如预期的那样)。 所以,我发现在页面加载完成后,通过javascript将这个标签注入到DOM中。 我会厌倦这个解决scheme,除非你确切地知道什么样的HTML被加载到webview,否则我怀疑它会有意想不到的后果。 就我而言,我正在加载HTMLstring,所以我可以将其添加到随应用程序一起提供的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, maximum-scale=1.0, user-scalable=no');document.getElementsByTagName('head')[0].appendChild(meta);"; [webView evaluateJavaScript:javascript completionHandler:nil]; } 

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

Full Swift 3 / iOS 10版本的景观回答:

 import UIKit import WebKit class MyViewController: UIViewController, UIScrollViewDelegate { var webView = WKWebView() override func viewDidLoad() { super.viewDidLoad() self.view.addSubview(webView) webView.scrollView.delegate = self } // Disable zooming in webView func viewForZooming(in: UIScrollView) -> UIView? { return nil; } } 

Swift 2.0

 extension WKWebView { func viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView? { return nil } } 

我已经尝试将UIScrollView minimumZoomScalemaximumZoomScale属性设置为1或将UIView isMultipleTouchEnabled属性设置为false或者返回nil来调用UIScrollViewDelegate viewForZooming(in:) ,但是都没有工作。 在我的情况下,经过几次反复试验,以下作品在我的情况[testing在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 } } 

我没有足够的声望来给答案添加评论,但是我想提一下,凯文的解决scheme(元视口)不再适用于iOS 10 beta。 虽然Landschaft的解决scheme正在为我工​​作!

由于JS解决scheme使用W3C标准,因此应始终得到支持。

啊,凯文,我希望这是如何工作的。

更多这里: https : //stackoverflow.com/a/37859168/1389714

如果你不处理html内部的链接并不重要(比如你只想显示文本),最简单的方法就是closures用户交互webView.userInteractionEnabled = false

我们需要在XCode 8中使用以下签名来更改委托调用:

重写func viewForZooming(在scrollView:UIScrollView) – > UIView? {return nil}

这是我如何禁用缩放Swift3视图控制器的一个 WebView的 应用程序

 import UIKit import WebKit class ViewController: UIViewController, WKNavigationDelegate, UIScrollViewDelegate { @IBOutlet var webView: WKWebView! override func loadView() { webView = WKWebView() webView.navigationDelegate = self view = webView } override func viewDidLoad() { super.viewDidLoad() webView.scrollView.delegate = self } func viewForZooming(in: UIScrollView) -> UIView? { return nil; } } 

如果webview是用于只读目的的用户,即仅用于显示web内容的使用

webView.isUserInteractionEnabled = false

通过这个缩放手势将无法工作。

你可以使用UIScrollViewDelegate。 首先在viewDidLoad()或其他合适的方法中将委托分配给你的webview:

 class LoginViewController: UIViewController, WKUIDelegate, UIScrollViewDelegate { override func viewDidLoad() { webView.scrollView.delegate = self } //And add this delegate method in your controller: func scrollViewWillBeginZooming(_ scrollView: UIScrollView, with view: UIView?) { scrollView.pinchGestureRecognizer?.isEnabled = false scrollView.panGestureRecognizer.isEnabled = false } } 

我工作的应用程序需要使用Javascript来放大视图。 被接受的答案阻止了从页面内部的JavaScript缩放。 我只需要禁用应用程序的用户捏手势。 我find的唯一的解决scheme是禁用页面加载后的Web视图的手势:

 - (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation { /* disable pinch gesture recognizer to allow zooming the web view by code but prevent zooming it by the user */ for (UIGestureRecognizer *gr in self.webView.scrollView.gestureRecognizers) { if ([gr isKindOfClass:[UIPinchGestureRecognizer class]]) { gr.enabled = NO; } } }