如何禁用Xamarin Forms中WebView的iOS端缩放功能
Xamarin.Forms iOS端WebView禁用缩放解决方案
问题根因
渲染器报错、缩放设置不生效的核心原因共3点:
- 苹果从iOS 12开始正式废弃
UIWebView,新版Xamarin.Forms iOS端WebView默认底层采用WKWebView实现,旧版继承WebViewRenderer、强转NativeView为UIWebView的写法已完全失效 - 改为继承
WkWebViewRenderer后,仍然将NativeView强转为UIWebView类型,该强转永远返回null,后续所有设置逻辑都不会执行 ScalesPageToFit属性仅控制网页是否自动缩放到适配WebView尺寸,没有任何禁止用户手动捏合、双击缩放的作用,就算正确设置也达不到禁用缩放的需求
正确实现代码
直接替换原有iOS端自定义渲染器代码即可:
using WebKit; using Xamarin.Forms; using Xamarin.Forms.Platform.iOS; [assembly: ExportRenderer(typeof(CustomWebView), typeof(CustomWebViewRenderer))] namespace YourAppNamespace.iOS { public class CustomWebViewRenderer : WkWebViewRenderer { protected override void OnElementChanged(VisualElementChangedEventArgs e) { base.OnElementChanged(e); if (NativeView == null || e.NewElement == null) return; // 禁用原生ScrollView缩放能力 ScrollView.MinimumZoomScale = 1; ScrollView.MaximumZoomScale = 1; ScrollView.ZoomScale = 1; ScrollView.BouncesZoom = false; // 注入JS强制修改页面viewport规则,禁止网页层面缩放 const string disableZoomScript = @" var meta = document.createElement('meta'); meta.name = 'viewport'; meta.content = 'width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no'; document.head.appendChild(meta); "; var userScript = new WKUserScript( new Foundation.NSString(disableZoomScript), WKUserScriptInjectionTime.AtDocumentEnd, false ); Configuration.UserContentController.AddUserScript(userScript); } } }
注意事项
- 如果加载的是本地自定义HTML内容,直接在HTML的
<head>标签内写入上述viewport meta标签即可,无需额外注入JS - 不要继续使用
UIWebView相关实现,苹果会拒绝所有包含UIWebView引用的应用提交App Store - 如果出现
WkWebViewRenderer类型找不到的报错,先将iOS项目的Xamarin.Forms包更新到最新稳定版本,同时确认代码中引用了Xamarin.Forms.Platform.iOS和WebKit命名空间
内容的提问来源于stack exchange,提问作者Arslan
相关产品推荐
相关产品推荐

