使用 Xamarin.Forms 和自定义 iOS 渲染器的 MvvmCross - 防止导航滑动 iOS - MasterDetail

MvvmCross with Xamarin.Forms and Custom iOS Renderer - Prevent Nav Swipe iOS - MasterDetail

简而言之,我希望在 MvvMCross 默认模板中为 iOS 禁用导航中的滑动手势。做了很多研究和试验,但都没有成功。这是我正在进行的 personal/opensource 项目。谢谢!!!

详情: 使用 MvvmCross 7.1.6(最新版本 2021 年 1 月 21 日)。我已经实现了一个 MvxContentPage。该页面上有 2 个操纵杆。该页面还打开了我想要的汉堡包。在 phone 上使用应用程序时,移动操纵杆时会出现左侧导航弹出窗口。我已经研究了所有我能找到的东西,并且成功地 Xamarin.Forms 禁用了手势,但是在 MvvmCross 中我找不到防止滑动的方法。我知道在其他论坛上也有类似的 post,但没有找到有效的方法。从 2016 年开始,我能够使用 Xamarin post 构建自定义渲染器,但它似乎不成立(下面的代码)。我可以确认渲染器已被调用。

using AstromechControl.iOS.CustomRenderers;
using UIKit;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;
[assembly: ExportRenderer(typeof(AstromechControl.UI.Pages.JoystickPage), typeof(NoSwipeiOSCustomPageRenderer))]
namespace AstromechControl.iOS.CustomRenderers
{
    public class NoSwipeiOSCustomPageRenderer : PageRenderer
    {
        public override void ViewDidAppear(bool animated)
        {
            base.ViewDidAppear(animated);
            UINavigationController navctrl = ViewController.NavigationController;
            navctrl.InteractivePopGestureRecognizer.Enabled = false;
            
            ViewController.SetNeedsUpdateOfScreenEdgesDeferringSystemGestures();
        }

       
    }
}

好吧,如果有人在 2021 年仍在尝试解决这个问题……这里是解决方案…… https://github.com/MvvmCross/MvvmCross/issues/2306

使用我上面发布的自定义页面渲染器和这个 github link 的组合。我最终得到以下结果:

using AstromechControl.iOS.CustomRenderers;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;

[assembly: ExportRenderer(typeof(AstromechControl.UI.Pages.JoystickPage), typeof(NoSwipeiOSCustomPageRenderer))]
namespace AstromechControl.iOS.CustomRenderers
{
    public class NoSwipeiOSCustomPageRenderer : PageRenderer
    {
        public override void ViewDidAppear(bool animated)
        {
            if (Xamarin.Forms.Application.Current.MainPage is MasterDetailPage masterDetailPage)
            {
                masterDetailPage.IsGestureEnabled = false;
            }
            else if (Xamarin.Forms.Application.Current.MainPage is NavigationPage navigationPage && navigationPage.CurrentPage is MasterDetailPage nestedMasterDetail)
            {
                nestedMasterDetail.IsGestureEnabled = false;
            }
        }

       
    }
}