【发布时间】:2019-09-12 20:39:11
【问题描述】:
我在 Masterdetail 页面中的幻灯片菜单遇到了一些问题。我想禁用 iOS 中的功能。
在Android,我可以禁用。但是,在 iOS 中它不起作用。
"IsGestureEnabled="False" - 此属性在 Android 中运行。但在 iOS 中没有。
请帮我解决这个问题。
【问题讨论】:
标签: xamarin.forms
我在 Masterdetail 页面中的幻灯片菜单遇到了一些问题。我想禁用 iOS 中的功能。
在Android,我可以禁用。但是,在 iOS 中它不起作用。
"IsGestureEnabled="False" - 此属性在 Android 中运行。但在 iOS 中没有。
请帮我解决这个问题。
【问题讨论】:
标签: xamarin.forms
它似乎已经存在,您可以使用 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;
}
创建CustomRenderer 的Page
[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;
}
}
}
}
}
}
【讨论】: