我对此很新,很抱歉,如果这是一个愚蠢的问题。如何让我的Xamarin.Forms应用程序在状态栏下方或缺口处开始?我尝试使用NavigationPage
,但随后开始在屏幕顶部下方佩戴。我还看到了其他一些解决方案,但我无法使其发挥作用。
有人可以帮忙吗?
谢谢!
答案 0 :(得分:13)
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/感谢亚当,不是我!