我目前正在更新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
SafeAreaInsets()
返回正确的值(在OnAppearing
中)OnSizeAllocated
旋转后称为乘法SafeAreaInsets()
返回正确的值SafeAreaInsets()
返回0,0,0,0
我当前的工作解决方案是,同时覆盖这两者并仅在
Thickness
返回的SafeAreaInsets()
不是default(Thickness)
的情况下设置我的bindable属性(绑定(bind)到我的 View )。我想知道是否存在始终获得正确插图的标准方法,而无需检查插图是否具有声音值。
最佳答案
我对此做了一些研究。这是我的几点想法:
UseSafeArea
-就是FYI 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/