Xamarin Forms Shell 覆盖 iOS (iPad) 上的顶部信息行

Xamarin Forms Shell covering top information line on iOS (iPad)

我有一个使用新 Shell 功能的 Xamarin Forms 应用程序。我现在的问题是 shell 菜单区域(顶部的汉堡菜单区域)被我的应用覆盖,我不希望它被覆盖。

这就是我要说的。

您可以在我的应用程序的第二张图片中看到顶部带有数据和时间的区域。我希望情况并非如此。

在其他应用程序中,我在内容页面上这样做过:

<ContentPage.Padding>
    <OnPlatform x:TypeArguments="Thickness">
        <On Platform="iOS">8,20,8,0</On>
        <On Platform="Android">8,0,8,0</On>
        <On Platform="UWP">8,0,8,0</On>
    </OnPlatform>
</ContentPage.Padding>

在 Shell 页面我试过:

<Shell.Padding>
    <OnPlatform x:TypeArguments="Thickness">
        <On Platform="iOS">8,20,8,0</On>
        <On Platform="Android">8,0,8,0</On>
        <On Platform="UWP">8,0,8,0</On>
    </OnPlatform>
</Shell.Padding>

但这没什么区别。知道如何使日期/时间不被 Shell 菜单覆盖吗?

更新: 如下所述应用 iOS 安全区域后,应用程序对我来说看起来是一样的:

数据和时间后面的背景仍然是shell header的背景颜色(即黑色)所以你看不到它们。我希望 shell 向下移动,这样用户仍然可以在左侧看到日期/时间,在右侧看到网络/收费指示器。

由于 iOS 11 及更高版本,我强烈建议您尝试在 iOS 中设置安全区域,这相当简单并且可能会解决您的问题:https://docs.microsoft.com/en-us/xamarin/xamarin-forms/platform/ios/page-safe-area-layout

我有一个解决方法,就是修改状态栏文本颜色来标记它。如果你的app导航背景颜色一直保持深色风格,这个workaround不会有问题。但是它不是一个完美的解决方案。因为它无法在运行时修改。在找到最佳解决方案之前,您可以尝试一下。

解决方法需要在iOS解决方案中打开Info.plist

添加两个键值修改状态栏内容的样式,

<string>Assets.xcassets/AppIcon.appiconset</string>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>

那么连导航栏的颜色都是黑色,状态栏的文字颜色也会被看到。

第二种解决方法:(比第一种更好)

还需要在iOS解决方案中打开Info.plist,但只需要在其中添加一个键值即可。

<string>Assets.xcassets/AppIcon.appiconset</string>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>

然后在AppDelegate.cs中添加设置状态栏背景颜色为White颜色的方法。

public override void OnActivated(UIApplication uiApplication)
{
    base.OnActivated(uiApplication);
    if (UIDevice.CurrentDevice.CheckSystemVersion(13, 0))
    {
        // If VS has updated to the latest version , you can use StatusBarManager , else use the first line code
        // UIView statusBar = new UIView(UIApplication.SharedApplication.StatusBarFrame);
        UIView statusBar = new UIView(UIApplication.SharedApplication.KeyWindow.WindowScene.StatusBarManager.StatusBarFrame);
        statusBar.BackgroundColor = UIColor.White;
        //statusBar.TintColor = UIColor.White;
        UIApplication.SharedApplication.KeyWindow.AddSubview(statusBar);
    }
    else
    {
        UIView statusBar = UIApplication.SharedApplication.ValueForKey(new NSString("statusBar")) as UIView;
        if (statusBar.RespondsToSelector(new ObjCRuntime.Selector("setBackgroundColor:")))
        {
            statusBar.BackgroundColor = UIColor.White;
            //statusBar.TintColor = UIColor.White;
            UIApplication.SharedApplication.StatusBarStyle = UIStatusBarStyle.BlackOpaque;
        }
    }
}

图片如下:

效果:

注意:如果以后发现更好的解决方法,将在此处更新。