当 View.OnAppearing 被触发时 SafeAreaInsets 为 0

Posted

技术标签:

【中文标题】当 View.OnAppearing 被触发时 SafeAreaInsets 为 0【英文标题】:SafeAreaInsets are 0 when View.OnAppearing gets triggered 【发布时间】:2020-12-31 09:45:39 【问题描述】:

我在做一些手动定位,需要考虑ios上的安全区。

我遇到的问题是,当我在 OnAppearing 方法中时,SafeAreaInserts 方法返回的厚度值为 0。旋转设备后(在 SizeChanged 事件中),情况不再如此。由于进入视图时不会触发 SizeChanged,因此我找不到设置 SafeAreaInsets 时引发的事件。

var safeInsets = On().SafeAreaInsets();

在 this topic 中,我发现更改 SafeAreaInsert 的事件“稍后”触发,但我的共享 Xamarin.Forms 项目中似乎没有 this event。

【问题讨论】:

【参考方案1】:

对于ViewSafeAreaInsetsDidChange 方法,它是从PageRenderer 调用的。您可以覆盖默认的 iOS PageRenderer 并连接到 ViewSafeAreaInsetsDidChange 覆盖。

    public override void ViewSafeAreaInsetsDidChange()
    

        var page = (Element as Page);
        if (page != null && Forms.IsiOS11OrNewer)
        
            var insets = NativeView.SafeAreaInsets;
            if(page.Parent is TabbedPage)
            
                insets.Bottom = 0;
            
            page.On<PlatformConfiguration.iOS>().SetSafeAreaInsets(new Thickness(insets.Left, insets.Top, insets.Right, insets.Bottom));
        
        
        base.ViewSafeAreaInsetsDidChange();
    

更多详情,您可以查看下面的链接。 https://github.com/xamarin/Xamarin.Forms/blob/4d49e5786a4c9cfc6eea00bbaa5b57bc09679186/Xamarin.Forms.Platform.iOS/Renderers/PageRenderer.cs

【讨论】:

以上是关于当 View.OnAppearing 被触发时 SafeAreaInsets 为 0的主要内容,如果未能解决你的问题,请参考以下文章

请问C# Winform项目中子类的事件被触发时,怎么跨类更新UI。

当 div 被填充/可见时触发事件

当 runloop 被阻塞时,NSTimer 不会触发

当 ViewController 被呈现的 ViewController 覆盖时触发事件

当 ALAssetsLibraryGroupsEnumerationResultsBlock 函数在 ios 中被触发时

当文章被更改时,DDL 触发器从复制中删除文章