我目前正在更新iPhone X的一些 View 。据this blog post所述,它应该相当直观,但是-像往常一样-它不像预期的那样平滑。

如果您使用推荐的方式

public MyView()
{
    InitializeComponent();

    On<Xamarin.Forms.PlatformConfiguration.iOS>().SetUseSafeArea(true);
}

根据安全区域插图,为 View 的项目指定了Margin,但这也适用于像SearchBar这样的 View ,这些 View 已经可以立即使用。使用上面的代码将导致搜索栏的灰色背景没有占据整个宽度,这看起来很奇怪。

幸运的是,On<iOS>具有扩展方法SafeAreaInsets(),该方法可以在某些条件下返回正确的插图,例如可以将其分配给BindableProperty。不幸的是,我们可以获得插图的条件不是很一致。
  • 首次调用OnSizeAllocated时,SafeAreaInsets()将返回0,0,0,0
  • 显示 View 时,SafeAreaInsets()返回正确的值(在OnAppearing中)
  • OnSizeAllocated旋转后称为乘法
  • 第一次SafeAreaInsets()返回正确的值
  • 第二次SafeAreaInsets()返回0,0,0,0

  • 我当前的工作解决方案是,同时覆盖这两者并仅在Thickness返回的SafeAreaInsets()不是default(Thickness)的情况下设置我的bindable属性(绑定(bind)到我的 View )。

    我想知道是否存在始终获得正确插图的标准方法,而无需检查插图是否具有声音值。

    最佳答案

    我对此做了一些研究。这是我的几点想法:

  • 您实际上可以在XAML(docs)中设置UseSafeArea-就是FYI
  • 当使用this extension method时,会发生SafeArea的设置,这基本上设置了SafeAreaInsetsPropertyKey属性,然后使用Padding方法更新页面UpdatePadding。这里的问题是,什么调用该扩展方法并进行设置?我检查了Xamarin.Forms github存储库,答案很简单。当 PageRenderer 调用iOS时,它会从ViewSafeAreaInsetsDidChange中调用。这意味着您不确切知道iOS何时决定通知您有关当前SafeArea的信息-您在不同时间使用不同插图值看到的问题。

  • 我知道这绝对不是任何人想要的,但是您可以覆盖默认的iOS PageRenderer并连接到ViewSafeAreaInsetsDidChange覆盖。调用后,您可以100%确保您具有当前的SafeArea插入值。

    关于xamarin.forms - 在Xamarin中获取iPhone X安全区域插图的一致方法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47647103/

    10-12 05:17