在Xamarin.Forms中为iPhone X获取安全区域内容的一致方法是什么

Pau*_*her 8 xamarin.forms iphone-x

我目前正在为iPhone X更新一些视图.根据这篇博文,它应该是相当直接的,但是 - 像往常一样 - 它并不像它应该的那样平滑.

如果您使用推荐的方式

public MyView()
{
    InitializeComponent();

    On<Xamarin.Forms.PlatformConfiguration.iOS>().SetUseSafeArea(true);
}
Run Code Online (Sandbox Code Playgroud)

视图的项目Margin根据安全区域插入给出,但这也适用于SearchBar已经适应开箱即用插图的视图.使用上面的代码将导致搜索栏的灰色背景不占据整个宽度,这看起来很奇怪.

幸运的是,On<iOS>有一个扩展方法SafeAreaInsets(),它返回正确的插入 - 在某些条件下 - 例如可以分配给一个BindableProperty.不幸的是,我们获得内容的条件并不十分一致.

  • OnSizeAllocated第一次被召唤时,SafeAreaInsets()将返回0,0,0,0
  • 显示视图时SafeAreaInsets()返回正确的值(in OnAppearing)
  • OnSizeAllocated 旋转后称为乘法
    • 第一次SafeAreaInsets()返回正确的值
    • 第二次SafeAreaInsets()回来了0,0,0,0

我当前的工作解决方案是,如果Thickness返回的SafeAreaInsets()不是,则覆盖两者并仅设置我的可绑定属性(绑定到我的视图)default(Thickness).

我想知道是否有一种标准的方法来始终获得正确的插入,而不必检查插入是否具有声音值.

Mik*_*res 6

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

  1. 您实际上可以UseSafeArea在 XAML ( docs ) 中设置 - 这只是仅供参考

  2. 的设置SafeArea发生在使用这个扩展方法时,它基本上设置了SafeAreaInsetsPropertyKey属性,然后PaddingUpdatePadding方法中更新页面。这里的问题是,什么调用该扩展方法并设置它?我检查了 Xamarin.Forms github 存储库,答案很简单。PageRendereriOSViewSafeAreaInsetsDidChange调用时,它会从调用。这意味着您并不确切知道 iOS 何时决定通知您当前的问题 - 您在不同时间使用不同的插图值看到的问题。SafeArea

我知道这绝对不是任何人想要的,但您可以覆盖默认的 iOSPageRenderer并连接到ViewSafeAreaInsetsDidChange覆盖。一旦它被调用,你就可以 100% 确定你有当前的SafeArea插入值。