问题描述
iPadOS 14上的Home应用程序在状态栏的左侧显示黑色文本,在右侧显示白色文本。如何实现的?可以通过公共API完成吗?
解决方法
可以通过公共API完成吗?
是的,所有这些都在UIBarStyle
中定义。由于添加到splitview的每个uiviewcontroller均嵌入其自己的UINavigationController中,因此您可以为每个uiviewscontroller.navigationController!.navigationBar.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()
}
我发现的其他有用资源:
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时进行了相应的更新。