【问题标题】:How to disable the Slide Menu functionality in iOS Xamarin.Forms如何在 iOS Xamarin.Forms 中禁用幻灯片菜单功能
【发布时间】:2019-09-12 20:39:11
【问题描述】:

我在 Masterdetail 页面中的幻灯片菜单遇到了一些问题。我想禁用 iOS 中的功能。

Android,我可以禁用。但是,在 iOS 中它不起作用。

"IsGestureEnabled="False" - 此属性在 Android 中运行。但在 iOS 中没有。

请帮我解决这个问题。

【问题讨论】:

    标签: xamarin.forms


    【解决方案1】:

    它似乎已经存在,您可以使用 CustomRenderer 。这是workaround。但是,由于 Xamarin 的更新,此解决方法似乎已过时。所以我们可以改进它。

    [assembly: ExportRenderer (typeof(MasterDetailPage), typeof(ExtendedMasterDetailPageRenderer), UIUserInterfaceIdiom.Phone)]
    namespace Core.iOS.Renderers
    {
        public class ExtendedMasterDetailPageRenderer : PhoneMasterDetailRenderer
        {
            private MasterDetailPage page;
    
            public ExtendedMasterDetailPageRenderer ()
            {
    
            }
    
             // add following override method
            public override void ViewDidLayoutSubviews()
            {
              base.ViewDidLayoutSubviews();
              ((MasterDetailPage)this.Element).PropertyChanged += HandlePropertyChanged;
            }
            
            public override void ViewDidLoad ()
            {
                base.ViewDidLoad ();
    
                ((MasterDetailPage)this.Element).PropertyChanged += HandlePropertyChanged;
            }
    
            private void HandlePropertyChanged (object sender, PropertyChangedEventArgs e)
            {
                if (e.PropertyName == MasterDetailPage.IsGestureEnabledProperty.PropertyName)
                {
                    var panGesture = typeof(PhoneMasterDetailRenderer).GetField ("panGesture", BindingFlags.NonPublic | BindingFlags.Instance).GetValue (this) as UIPanGestureRecognizer;
                    var hasPanGesture = false;
    
                    if (panGesture != null)
                    {
                        for (int i = 0; i < this.View.GestureRecognizers.Length; i++)
                        {
                            if (this.View.GestureRecognizers [i] is UIPanGestureRecognizer)
                            {
                                hasPanGesture = true;
                                break;
                            }
                        }
    
                        if (((MasterDetailPage)this.Element).IsGestureEnabled)
                        {
                            if (!hasPanGesture)
                            {
                                this.View.AddGestureRecognizer (panGesture);
                            }
                            return;
                        }
    
                        if (hasPanGesture)
                        {
                            this.View.RemoveGestureRecognizer (panGesture);
                        }
                    }
                }
            }
        }
    }
    

    在你的 MasterDetailPage

    protected override void OnAppearing()
    {
       base.OnAppearing();
    
       IsGestureEnabled = false;
    }
    

    更新

    创建CustomRendererPage

    [assembly: ExportRenderer(typeof(Page), typeof(MyPageRenderer), UIUserInterfaceIdiom.Phone)]
    namespace xxx.iOS
    {
        class MyPageRenderer : PageRenderer
        {
            public override void ViewDidLayoutSubviews()
            {
                base.ViewDidLayoutSubviews();
                if (this.NavigationController != null)
                {
                    var items = this.NavigationController.NavigationBar.Items;
                    if(items.Length > 0)
                    {
                        UIBarButtonItem leftItem = items[0].LeftBarButtonItem;
                        if(this.NavigationController.ViewControllers.Length == 1)
                        {
                            leftItem.Enabled = false;
                        }                   
                    }
                }
            }
        }
    }
    

    【讨论】:

    • 它禁用了幻灯片菜单。但是当我点击汉堡图标时,菜单是可见的。我想在 iOS 中禁用该点击事件。
    • 既然你不想用汉堡菜单,为什么还要用 MatserDetailPage?
    • 实际上,我需要那个菜单栏和工具栏项。在Android中,它被禁用。但在 iOS 中不起作用。
    • 检查我的答案。
    猜你喜欢
    • 2015-07-16
    • 2015-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-11
    • 2018-02-20
    • 1970-01-01
    相关资源
    最近更新 更多