如何在Xamarin.Forms中使用自定义UIViewController解决iOS11边缘触控延迟
解决Xamarin.Forms iOS11+底部自定义菜单触控延迟问题
这个问题本质是iOS11引入的**系统边缘手势(比如上滑返回主屏幕)**和你的自定义底部菜单触控区域冲突了——系统会优先监听自身手势,导致你的菜单点击出现明显延迟。重写PreferredScreenEdgesDeferringSystemGestures确实是正确的解决方向,下面一步步教你在Xamarin.Forms中落地实现:
1. 创建自定义iOS页面渲染器
在你的iOS项目里新建一个类(比如命名为CustomPageRenderer),继承Xamarin.Forms默认的页面渲染器PageRenderer,然后重写目标方法:
using UIKit; using Xamarin.Forms; using Xamarin.Forms.Platform.iOS; [assembly: ExportRenderer(typeof(ContentPage), typeof(YourAppName.iOS.Renderers.CustomPageRenderer))] namespace YourAppName.iOS.Renderers { public class CustomPageRenderer : PageRenderer { public override UIRectEdge PreferredScreenEdgesDeferringSystemGestures { get { // 指定延迟底部系统手势,让自定义菜单触控优先被识别 return UIRectEdge.Bottom; } } } }
关键说明:
ExportRenderer特性是核心:它告诉Xamarin.Forms,当渲染ContentPage类型的页面时,使用我们的自定义渲染器。如果你的自定义菜单只在特定页面存在,把ContentPage换成对应的页面类(比如MainMenuPage)即可,避免全局生效。- 返回
UIRectEdge.Bottom的作用:让iOS系统延迟处理底部的边缘手势,这样你的自定义菜单点击会被优先响应,直接解决触控延迟问题。
2. 容器页面的适配(可选)
如果你的应用用了NavigationPage或TabbedPage这类容器页面,你需要针对容器做自定义渲染器,原理完全一致:
比如针对NavigationPage的渲染器:
[assembly: ExportRenderer(typeof(NavigationPage), typeof(YourAppName.iOS.Renderers.CustomNavigationRenderer))] namespace YourAppName.iOS.Renderers { public class CustomNavigationRenderer : NavigationRenderer { public override UIRectEdge PreferredScreenEdgesDeferringSystemGestures { get => UIRectEdge.Bottom; } } }
这样整个导航栈里的页面都会自动应用这个手势延迟规则。
3. 验证效果
编译运行iOS11+的设备,点击底部自定义菜单,就能看到之前的触控延迟消失了。
内容的提问来源于stack exchange,提问作者M. Hartner
相关产品推荐
相关产品推荐

