在 iOS13 上更改状态栏颜色

Dav*_*ton 3 c# xamarin.ios xamarin ios13

在 iOS 13 之前,我可以使用以下代码更改状态栏颜色:

        UIView statusBar = UIApplication.SharedApplication.ValueForKey(new NSString("statusBar")) as UIView;
        if (statusBar.RespondsToSelector(new ObjCRuntime.Selector("setBackgroundColor:")))
        {
            statusBar.BackgroundColor = UIColor.Clear.FromHex(0x323232);
            statusBar.TintColor = UIColor.White;
            app.StatusBarStyle = UIStatusBarStyle.BlackOpaque;
        }
Run Code Online (Sandbox Code Playgroud)

但是,在 iOS13 上,我收到以下运行时错误

抛出的 Objective-C 异常。名称:NSInternalInconsistencyException 原因:在 UIApplication 上调用了 -statusBar 或 -statusBarWindow 的应用程序:必须更改此代码,因为不再有状态栏或状态栏窗口。改为在窗口场景中使用 statusBarManager 对象。

关于如何更改 iOS13 上的状态栏的任何想法?

编辑:只是指出,这是针对 Xamarin 而不是针对 Swift。澄清重复标记。

Jun*_*ang 7

从错误,您需要在 IOS 13 中使用UIStatusBarManager

如果您已将 VS 更新到最新版本(Visual Studio 2019 版本 16.3.0/Visual Studio 2019 for Mac 版本 8.3以上),您可以更改颜色如下:

UIView statusBar = new UIView(UIApplication.SharedApplication.KeyWindow.WindowScene.StatusBarManager.StatusBarFrame);
statusBar.BackgroundColor = UIColor.Yellow;
UIApplication.SharedApplication.KeyWindow.AddSubview(statusBar);
Run Code Online (Sandbox Code Playgroud)

否则以下方法可以使其工作。

UIView statusBar = new UIView(UIApplication.SharedApplication.StatusBarFrame);
statusBar.BackgroundColor = UIColor.Yellow;
UIApplication.SharedApplication.KeyWindow.AddSubview(statusBar);
Run Code Online (Sandbox Code Playgroud)

如果视图未完全呈现,UIApplication.SharedApplication.KeyWindow将返回 null。因此您可以在完全呈现后更改状态栏颜色。这是示例

====================================更新============== ====================

如果在 Forms 项目中,您可以尝试使用 invoking 方法 AppDelegate.cs

public override void OnActivated(UIApplication 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.Red;
        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.Red;
            UIApplication.SharedApplication.StatusBarStyle = UIStatusBarStyle.BlackOpaque;
        }
    }
    base.OnActivated(uiApplication);
} 
Run Code Online (Sandbox Code Playgroud)

笔记 :

不确定这个解决方案是否总是有效AppDelegate.cs,更好地调用 inController.cs的方法,因为从 iOS 13 开始,Apple 已经修改了AppDelegate 的架构并将SceneDelegate添加 到项目中。