我是这个新手,很抱歉这是一个愚蠢的问题。在适用时,如何使我的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取决于您的布局,但是这样您就可以更好地控制使用安全区域插图的方式,尽管它有点麻烦。