2

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

来自家庭应用程序的示例图像

4

2 回答 2

1

可以通过公共 API 完成吗?

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

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

您还可以创建自己的视图控制器,并将它们的首选状态栏样式定义为 .lightContent 或 .darkContent ,方法是根据文档覆盖 childForStatusBarStyle 。

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

根据 Apples wwdc20 Build for iPad。使用 UISplitViewController 的新功能重建主页。

减去按钮和花哨的背景。主页拆分视图是一个 UISplitViewController 使用 doubleColumn 样式初始化。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 笔记

UISplitViewController 苹果文档

于 2020-10-08T14:50:18.210 回答
0

仅当根视图控制器是 UISplitViewController 时才能这样做。我已经在 iOS 14 中设置了新的拆分视图列样式,但旧的方式也应该可以工作。

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

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

    var embeddedSplitViewController: UISplitViewController?

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, 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 时相应地更新。

于 2020-10-15T15:46:16.610 回答