.NET MAUI、ios UseSafeArea 不工作 StackLayout、VerticalStackLayout 和 Grid

问题描述 投票:0回答:2
maui safearea
2个回答
7
投票

默认情况下.NET MAUI 将考虑安全区域。所以使用特定于平台的UseSafeArea就是禁用安全区域。目前,将 UseSafeArea 设置为 false 不会改变行为(尽管应该如此),这是一个错误。另请参阅 MAUI github 上的问题:https://github.com/dotnet/maui/issues/5856

您还可以设置 IgnoreSafeArea 属性来实现相同的目的。但是,它不再在 .NET 7 中工作,请参阅以下问题:https://github.com/dotnet/maui/issues/12823

要解决您的问题,您需要将

IgnoreSafeArea="True"
添加到您的 Grid 或 StackLayout 并将
ios:Page.UseSafeArea="False"
添加到您的页面。这应该不是必需的,但这是对我有用的解决方法。

iOS emulator showing content outside safe area

有关在 iOS 上禁用安全区域的文档可以在此处找到:https://learn.microsoft.com/en-us/dotnet/maui/ios/platform-specifics/page-safe-area-layout?view=net-毛伊岛-7.0


4
投票

您可以设置 Page Padding 值来实现。在OnAppearing方法中,设置页面的safeInsets,如下代码:

protected override void OnAppearing()
{
    base.OnAppearing();
    
    DeviceSafeInsetsService d = new DeviceSafeInsetsService(); 
    double topArea = d.GetSafeAreaTop();
    double bottomArea = d.GetSafeAreaBottom();
    var safeInsets = On<iOS>().SafeAreaInsets();
    safeInsets.Top = -topArea;
    safeInsets.Bottom = -bottomArea;

    Padding = safeInsets;
}

要获取 topAreabottomArea 值,您应该编写平台代码。答案末尾附有有关此内容的更详细教程。

首先你可以在Project文件夹中生成一个新的类文件并将其更改为部分类。生成两个部分方法。

public partial class DeviceSafeInsetsService
{
    public partial double GetSafeAreaTop();
    public partial double GetSafeAreaBottom();
}

然后在iOS平台生成部分文件并实现。该文件位于 Project/Platform/iOS 文件夹中,我想提一下的是,该文件是一个部分文件,因此命名空间应与上面的文件相同。生成此文件时,请删除命名空间中的 .Platforms.iOS 后缀。

public partial class DeviceSafeInsetsService
{
    public partial double GetSafeAreaBottom()
    {
        if (UIDevice.CurrentDevice.CheckSystemVersion(11, 0))
        {
            UIWindow window = UIApplication.SharedApplication.Delegate.GetWindow();
            var bottomPadding = window.SafeAreaInsets.Bottom;
            return bottomPadding;
        }
        return 0;
    }
    public partial double GetSafeAreaTop()
    {
        if (UIDevice.CurrentDevice.CheckSystemVersion(11, 0))
        {
            UIWindow window = UIApplication.SharedApplication.Delegate.GetWindow();
            var TopPadding = window.SafeAreaInsets.Top;
            return TopPadding;
        }
        return 0;
    }
}

更多信息,您可以参考如何在.NET MAUI中编写特定于平台的代码MauiPlatformCode示例代码

希望它对你有用。

© www.soinside.com 2019 - 2024. All rights reserved.