【问题标题】:Xamarin.Forms: How to make the iOS status bar background opaque black?Xamarin.Forms:如何使 iOS 状态栏背景不透明黑色?
【发布时间】:2018-11-26 15:37:55
【问题描述】:

我在没有导航栏的 NavigationPage 中有一个带有 WebView 的 ContentPage (NavigationPage.SetHasNavigationBar(this, false);)。

问题:iOS 上的状态栏一直是透明的,通过它可以看到内容。我想避免这种情况,我想要一个带有白色文本的不透明/纯黑色状态栏。

我想过在状态栏下方简单地放置一个高度为 20 pt 的彩色矩形,但是如何确保它具有适合 iPhone X 型手机的正确尺寸,即 44 pt? (iPhone XS Max、iPhone XR)。

  • NavigationPage.BarBackgroundColorBarTextColor 在导航栏隐藏时似乎没有区别。
  • UIStatusBarStyleBlackOpaque 已弃用。
  • 设置UIStatusBarStyle UIViewControllerBasedStatusBarAppearance == false可以改 文本的颜色,但不是背景:背景总是 透明。
  • 我没有在其他 Stack Overflow 问题(或其他任何地方)中找到答案。

【问题讨论】:

    标签: ios xamarin xamarin.forms xamarin.ios


    【解决方案1】:

    在状态栏下方创建一个彩色矩形是正确的。

    在页面的自定义页面渲染器(此处称为MyPage)中,创建一个带有黑色背景的视图/子视图(UIView),覆盖状态栏(即在其下方,为其提供背景) )。据我了解,从 iOS 7 开始,状态栏从来没有背景,总是半透明的。

    using MyApp;
    using MyApp.iOS;
    using UIKit;
    using Xamarin.Forms;
    using Xamarin.Forms.Platform.iOS;
    
    [assembly:ExportRenderer (typeof(MyPage), typeof(MyPageRenderer))]
    namespace MyApp.iOS
    {
        public class MyPageRenderer : PageRenderer
        {
            protected override void OnElementChanged(VisualElementChangedEventArgs e)
            {
                base.OnElementChanged(e);
    
                if (e.OldElement != null || Element == null)
                {
                    return;
                }
    
                UIView statusBarCoverView = new UIView(UIApplication.SharedApplication.StatusBarFrame);
                statusBarCoverView.BackgroundColor = UIColor.Black;
                View.AddSubview(statusBarCoverView);
            }
        }
    }
    

    Xamarin.Forms NavigationPage 将坚持将状态栏文本设置为黑色,即使之前的背景是明亮的,即使设置了黑色背景视图,即使设置了 BarBackgroundColorBarTextColor

    到目前为止,我发现的唯一更改方法是将Info.plist 中的UIViewControllerBasedStatusBarAppearance 设置为false,这会导致状态栏文本在整个应用程序中始终为白色:

    <key>UIStatusBarStyle</key>
    <string>UIStatusBarStyleLightContent</string>
    <key>UIViewControllerBasedStatusBarAppearance</key>
    <false/>
    

    不理想,但我还没有找到如何设置它。 UIApplication.SharedApplication.StatusBarStylePreferredStatusBarStyleSetNeedsStatusBarAppearanceUpdate() 似乎不起作用。我怀疑这是因为该页面是 NavigationPage 控制器的子控制器。

    【讨论】:

      【解决方案2】:

      在 Xcode 中,我能够在不使用代码的情况下实现这一点。首先,确保您使用的是导航控制器。然后单击该控制器中的顶部导航栏并将样式更改为“黑色”,将条色调更改为黑色,将色调(靠近底部)更改为白色。然后它会按预期自动填充内容。

      【讨论】:

      • 抱歉,这个问题专门针对 Xamarin.Forms 和一个没有可见导航栏的页面。
      • 糟糕,抱歉。
      【解决方案3】:

      如果你只是想让这个页面在 Xamarin.Forms 中不显示导航栏,

      添加此页面而不是导航页面的根。

      我建议当你推送到这个 WebView 页面时,不要使用 Navigation 页面,就这样做。

       Navigation.PushModalAsync(new NextPage());
      

      不使用Navigation.PushAsync(new NextPage());

      更多信息:

      如果 Xamarin.Forms 的方法不行,你可以试试原生 ios 方法。

      UIStatusBarStyle 设置为UIBarStyleBlack

      navigationBar.translucent 设置为NO

      半透明: 一个布尔值,指示导航栏是半透明的 (YES) 还是不透明的 (NO)。

      【讨论】:

      • 问题不在于导航栏,带有WebView的ContentPage就是启动页。你能详细说明一下原生iOS方法吗?当我想要不透明的黑色或在应用程序/页面的生命周期中调用它时,我不明白为什么要设置背景图像。
      • 您能否提供您的问题的屏幕截图。这会很有帮助。有时表单无法处理所有平台。
      • 谢谢。你知道在哪里设置 navigationBar.translucent 以便 Xamarin.Forms 不会覆盖它吗?是否需要 ContentPage 的自定义渲染器?
      • 是的,它需要 ContentPage 的自定义渲染器。如果有帮助,可以标记以帮助其他人。
      • 好的,如果你觉得我的回答有用,可以标记为对。
      猜你喜欢
      • 1970-01-01
      • 2016-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多