我正在寻找一种方法来禁用 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,添加子视图以捕获捏合手势等),但我总是发现这些会在事件中引入滞后,并希望保持实现尽可能干净/无黑客攻击。
您可以通过设置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
属性设置为1
或UIView
的isMultipleTouchEnabled
属性设置为false
或从调用UIScrollViewDelegate
的viewForZooming(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。