我正在寻找一种方法来禁用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,添加子视图以捕获捏手势等)但我总是发现那些引入滞后的事件并希望将实现保持为尽可能清洁/黑客 .
20 回答
我工作的应用程序需要通过Javascript缩放视图 . 接受的答案也阻止了JavaScript从页面内部进行缩放 . 我只需要禁用应用程序用户的捏合手势 . 我发现的唯一解决方案是在页面加载后禁用Web视图的手势:
您可以通过设置WKWebKit的UIScrollView的委托并实现
viewForZooming(in:)
来阻止用户进行缩放,如下所示:以下答案不再适用于iOS 10测试版 .
WKWebView似乎以与Mobile Safari相同的方式尊重视口元标记(如预期的那样) . 因此,我发现在页面加载完成后,通过javascript将该标记注入DOM . 除非你确切地知道HTML加载到webview中,否则我会厌倦这个解决方案,否则我怀疑它会产生意想不到的后果 . 就我而言,我正在加载HTML字符串,所以我可以将它添加到我随应用程序发布的HTML中 .
要对任何网页进行一般性操作:
看看刚刚完成了什么样的导航可能是明智的,因为只有新页面需要执行这个javascript .
我已经尝试将
UIScrollView
的minimumZoomScale
和UIScrollView
属性设置为UIView
或UIView
的isMultipleTouchEnabled
属性为false
或者从调用viewForZooming(in:)
UIScrollViewDelegate
返回nil
但没有效果 . 在我的情况下,经过几次试验和错误,以下工作在我的情况下[在iOS 10.3上测试]:完整 Swift 3 / iOS 10 版本的Landschaft的回答:
本机解决方案对我不起作用,注入JS并不理想 . 我注意到当发生缩放并调用我的委托时,即使我在初始化webview时禁用了pinchGestureRecognizer,也会启用它 . 要解决此问题,我会在缩放开始时将其设置为禁用:
Complete working code to disable zooming in WkWebView in swift
导入UIKit导入WebKit
class ViewController:UIViewController,WKUIDelegate {
}
如果您显示本地html,您可以修改此html并将此元标记放入您的html:
Swift 2.0
您可以使用UIScrollViewDelegate . 首先在viewDidLoad()或任何其他合适的方法中将委托分配给您的webview:
这是我为 one-webview-only app 视图控制器禁用缩放的方法 one-webview-only app
我没有足够的声誉来为答案添加评论,但我想提一下凯文的解决方案(元视口)不再适用于iOS 10测试版 . 不过,Landschaft的解决方案对我有用!
啊,凯文,我希望这些东西能起作用 .
更多这里:https://stackoverflow.com/a/37859168/1389714
如果你在html中处理链接并不重要(假设你只想显示文本),最简单的方法是关闭用户交互
webView.userInteractionEnabled = false
通过要求手势识别器失败,禁用双击以缩放手势 . 当用户双击时,它将阻止浏览器执行操作 .
我们需要在XCode 8中使用以下签名更改委托调用:
覆盖func viewForZooming(在scrollView:UIScrollView中) - > UIView?
如果webview是用户的只读目的,即仅用于显示Web内容的使用
webView.isUserInteractionEnabled = false
这样,缩放手势将无法使用 .
这是Gulshan Kumar 's answer that worked for me in iOS 12.1.2, and it also prevents zooming due to double-taps and rotation. In my example, I just inject the script directly into the web view. I adjusted the scale to 60%, and there'的略微修改版本,无需在构建源字符串时使用连接 .
如果最好在网页完成加载时取消Pinch缩放,并且还可以指定要转到哪个特定URL被废弃
一种防止缩放的简单方法
这对我有用 . https://gist.github.com/paulofierro/5b642dcde5ee9e86a130