如何在Xamarin.Forms中允许iOS状态栏和iPhone X缺口

时间:2017-12-12 19:12:24

标签: xamarin.forms xamarin.ios iphone-x

我对此很新,很抱歉,如果这是一个愚蠢的问题。如何让我的Xamarin.Forms应用程序在状态栏下方或缺口处开始?我尝试使用NavigationPage,但随后开始在屏幕顶部下方佩戴。我还看到了其他一些解决方案,但我无法使其发挥作用。 有人可以帮忙吗?

谢谢!

3 个答案:

答案 0 :(得分:13)

使用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);
        }
    }
}

答案 1 :(得分:1)

  

是否有可能让屏幕上的一个东西一直扩展到边缘?

(来自this回答)

在您提供的案例中,从安全区域的边界伸展元素可以说是一个用例。条形图仅仅是背景元素而不是内容,因为导航栏也可以拉伸以填满整个屏幕。

话虽如此,遗憾的是你不能免费获得,但必须自己实现。假设您有以下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取决于您的布局,但这样您可以更好地控制安全区域插入的使用方式,尽管它有点繁琐。

答案 2 :(得分:0)

您需要考虑安全区域,但要扩展背景颜色以全屏显示。所以你不应该使用

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/感谢亚当,不是我!