如何在Xamarin.forms中允许iOS状态栏和iPhone X Notch



我是这个新手,很抱歉这是一个愚蠢的问题。在适用时,如何使我的Xamarin.Forms应用程序在状态栏或缺口以下启动?我已经尝试使用NavigationPage,但是随后它开始在屏幕顶部以下佩戴。我还看到了其他一些解决方案,但是我无法使它起作用。谁能帮忙?

谢谢!

使用usesafearea

using Xamarin.Forms.PlatformConfiguration.iOSSpecific;
using Xamarin.Forms;
namespace iPhoneX 
{
    public partial class ItemsPage : ContentPage
    {
        public ItemsPage()
        {
            InitializeComponent();
            On<Xamarin.Forms.PlatformConfiguration.iOS>().SetUseSafeArea(true);
        }
    }
}

您需要考虑安全区域,但背景颜色会扩展以进行全屏。因此,您不应该使用

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

这将在底部和顶部边缘上带有大的空白空间。

相反,您应该测量安全区域并将其作为填充物应用于根视图。

[assembly: ResolutionGroupName("Enterprise")]
[assembly: ExportEffect(typeof(SafeAreaPaddingEffect), nameof(SafeAreaPaddingEffect))]
namespace Enterprise.iOS.Effects
{
    class SafeAreaPaddingEffect : PlatformEffect
    {
        Thickness _padding;
        protected override void OnAttached()
        {
            if (Element is Layout element)
            {
                if (UIDevice.CurrentDevice.CheckSystemVersion(11, 0))
                {
                    _padding = element.Padding;
                    var insets = UIApplication.SharedApplication.Windows[0].SafeAreaInsets; // Can't use KeyWindow this early
                    if (insets.Top > 0) // We have a notch
                    {
                        element.Padding = new Thickness(_padding.Left + insets.Left, _padding.Top + insets.Top, _padding.Right + insets.Right, _padding.Bottom);
                        return;
                    }
                }
                // Uses a default Padding of 20. Could use an property to modify if you wanted.
                element.Padding = new Thickness(_padding.Left, _padding.Top + 20, _padding.Right, _padding.Bottom);
            }
        }
        protected override void OnDetached()
        {
            if (Element is Layout element)
            {
                element.Padding = _padding;
            }
        }
    }
}

然后在XAML中:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"                 
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
             x:Class="Enterprise.View.Features.Authentication.LoginView"                 
             xmlns:effect="clr-namespace:Enterprise.View.Effects">        
    <Grid>                      
        <Grid.RowDefinitions>               
            <RowDefinition Height="100"/>                
            <RowDefinition Height="*" />            
        </Grid.RowDefinitions>            
        <ContentView BackgroundColor="Green">                
            <ContentView.Effects>                    
                <effect:SafeAreaPaddingEffect />                
            </ContentView.Effects>                
            <Label Text="Hello, from XamarinHelp.com" />            
        </ContentView>                    
    </Grid>
</ContentPage>

参考:https://xamarinhelp.com/safeareainsets-xamarin-forms-ios/谢谢亚当,而不是我!

是否可以在屏幕上将一件事一直展开到边缘?

(从此答案)

在您提供的情况下,可以说,从安全区域的边界伸展元素是一种用例。条形仅仅是背景元素,而不是导航栏,它也不满足,它也伸展以填充整个屏幕。

话虽如此,不幸的是,您不能免费获得此功能,但必须自己实施。假设您有以下XAML

<ContentPage ...>
    <StackLayout>
        <ContentView BackgroundColor="LightSkyBlue" HorizontalOptions="Fill" x:Name="Header">
            <!-- Header -->
        </ContentView>
        <ContentView x:Name="Content">
            <!-- Content -->
        </ContentView>
    </StackLayout>
</ContentPage>

在您的代码范围内(我不会这样使用它,而是要提出这一点。对于真实的应用程序,我已经写了一个实用程序类,该类别附加到视图并管理插图。)您可以现在检查是否更改属性SafeAreaInsets

class SafeAreaPage : ContentPage
{
    // elided constructor
    protected override void OnPropertyChanged(string propertyName)
    {
        if(propertyName = "SafeAreaInsets")
        {
            var insets = On<Xamarin.Forms.PlatformConfiguration.iOS>.GetSafeAreaInsets();
            var headerInsets = insets; // Thickness is a value type
            headerInsets.Bottom = 0;
            var contentInsets = insets;
            contentInsets.Top = 0;
            Header.Padding = headerInsets;
            Content.Padding = contentInsets;
        }
    }
}

您如何设置视图的Padding s取决于您的布局,但是这样您就可以更好地控制使用安全区域插图的方式,尽管它有点麻烦。

最新更新