iPadOS 14 上的家庭应用程序在状态栏左侧显示黑色文本,在右侧显示白色文本。这是如何实现的?可以通过公共 API 完成吗?
2 回答
可以通过公共 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()
}
我发现的其他有用资源:
仅当根视图控制器是 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 时相应地更新。