iPad:状态栏的一侧为白色,另一侧为黑色

问题描述

iPadOS 14上的Home应用程序在状态栏的左侧显示黑色文本,在右侧显示白色文本。如何实现的?可以通过公共API完成吗?

example image from Home app

解决方法

可以通过公共API完成吗?

是的,所有这些都在UIBarStyle中定义。由于添加到splitview的每个uiviewcontroller均嵌入其自己的UINavigationController中,因此您可以为每个uiviewscontroller.navigationController!.navigationBar.barStyle

设置barstyle

对于白色文本,请选择.black,而.default是黑色文本。 myHomeViewController.navigationController!.navigationBar.barStyle = .black

您还可以根据文档覆盖childForStatusBarStyle来创建自己的视图控制器,并将它们定义为preferredstatusbarstyle为.lightContent或.darkContent。

您可以覆盖视图控制器的首选状态栏样式 通过实现childForStatusBarStyle方法。

根据Apple的wwdc20 Build for iPad。使用UISplitViewController的新功能重建了房屋。

减去按钮和精美背景。主页拆分视图是使用doubleColumn样式初始化的UISplitViewController。 UISplitViewController(style: .doubleColumn)

仅在新项目的SceneDelegate.swift中的代码中创建拆分视图的示例:

func scene(_ scene: UIScene,willConnectTo session: UISceneSession,options connectionOptions: UIScene.ConnectionOptions) {
            guard let windowScene = (scene as? UIWindowScene) else { return }
            //UISplitViewControllerDelegate
            splitViewController.delegate = self
            //set which view is what
            splitViewController.setViewController(sidebarViewController,for: .primary)
            splitViewController.setViewController(myHomeViewController,for: .secondary)
            
            //setup of sidebar and detail controllers
            sidebarViewController.navigationController?.navigationBar.prefersLargeTitles = true
            myHomeViewController.navigationController?.navigationBar.prefersLargeTitles = true
            
            sidebarViewController.title = "Home"
            myHomeViewController.title = "Home"
            
            //appear side by side when a column is shown,use tile style.
            splitViewController.preferredSplitBehavior = .tile

            //'color' myHomeViewController statusbar to white,by setting barStyle = .black
            myHomeViewController.navigationController!.navigationBar.barStyle = .black
            //start styling your navigation controllers,As i've set preferesLargeTitles,style the navBars largeTitleTextAttributes
            myHomeViewController.navigationController!.navigationBar.largeTitleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
            //style viewcontroller
            myHomeViewController.view.backgroundColor = .blue
            // always have primary and secondary sidebyside
            //splitViewController.preferredDisplayMode = .oneBesideSecondary
            splitViewController.show(.primary)
            splitViewController.show(.secondary)
            
            window = UIWindow(windowScene: windowScene)
            window?.rootViewController = splitViewController
            window?.makeKeyAndVisible()
    }

我发现的其他有用资源:

TLDW wwdc20 notes

UISplitViewController apple docs

,

仅当根视图控制器是UISplitViewController时才可以这样做。我已经在iOS 14中使用新的splitview列样式进行了设置,但是较旧的方法也应该可以使用。

然后,您需要从每个viewController中获取navigationController并将其NavigationBar上的barStyle设置为.default或.black

将您的splitViewController设置为场景函数中UIWindow的根viewController之后,设置样式如下:

    var embeddedSplitViewController: UISplitViewController?

    func scene(_ scene: UIScene,options connectionOptions: UIScene.ConnectionOptions) {
        self.makeSplitViewController()

        // Use a UIHostingController as window root view controller.
        if let windowScene = scene as? UIWindowScene {
            let window = UIWindow(windowScene: windowScene)
            window.rootViewController = self.embeddedSplitViewController
            self.window = window
            window.makeKeyAndVisible()

            self.embeddedSplitViewController?.viewController(for: .primary)?.navigationController?.navigationBar.barStyle = .black
            self.embeddedSplitViewController?.viewController(for: .secondary)?.navigationController?.navigationBar.barStyle = .default
        }
    }

    func makeSplitViewController() {
        let splitViewController = UISplitViewController(style: .doubleColumn)

        // I have SwiftUI Views here but they could be any UIViewController
        let primaryViewController = UIHostingController(rootView: SidebarView())

        splitViewController.setViewController(primaryViewController,for: .primary)
        splitViewController.setViewController(UIHostingController(rootView: DetailView()),for: .secondary)

        let compactViewController = UIHostingController(rootView: SidebarView())
        splitViewController.setViewController(compactViewController,for: .compact)

        splitViewController.preferredPrimaryColumnWidth = 320
        self.embeddedSplitViewController = splitViewController
    }

这对我有用,statusBar反映了barStyle并在显示和隐藏主viewController时进行了相应的更新。