理想的には、ステータスバーの後ろに伸びる上部が濃い青色のナビゲーションバーになる新しいアプリがあります。この不透明で正しい色の青を作成するのは面倒でしたが、NavigationViewを含むビューのinit()に以下を配置することで、それを機能させる方法を最終的に理解しました。
init() {
UINavigationBar.appearance().barTintColor = UIColor(named: "primaryBlue")
UINavigationBar.appearance().backgroundColor = UIColor(named: "primaryBlue")
UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .default)
UINavigationBar.appearance().isOpaque = true
}
これにより、次のようなナビゲーションバーが表示されます。青色ですが、ステータスバーは黒のテキストで白のままです(白のテキストで濃い青にしたい)。
次に、ステータスバーのテキストを「ライトコンテンツ」にする必要があることを知り、Idiqual here から良い解決策を見つけましたが、これは単にバーの「テーマ」の色を変更するだけです。この方法を使用して背景色を変更する方法はないようです。実装後、暗い背景に明るいテキストを表示する準備ができたステータスバーがありますが、NavigationViewの暗い青色の背景をステータスバーの上部に拡張する方法を理解できません。だから私が残しているのはこれです:
.edgesIgnoringSafeArea(.top)をいくつかの異なる場所に追加するなど、いくつかのことを試しました。NavigationViewの閉じ括弧や、親ビューにあるTabViewも含まれますが、何も機能しません。簡単なものがないですか? NavigationBarの色を画面の上部に拡張するにはどうすればよいですか?これが私のナビビューのコードです。この構造体は「FetchFrontPageArticles」と呼ばれます。
var body: some View {
NavigationView {
VStack {
List(self.fetcher.articles) { article in
...
}.navigationBarTitle("", displayMode: .inline)
.navigationBarItems(
leading: Text(""),
trailing: NavProfile()
)
}
}
}
「FetchFrontPageArticles」は、次に示す親のTabViewから読み込まれます。
TabView(selection: $selection){
FetchFrontPageArticles()
.tabItem {
VStack {
Image("house")
Text("Home")
}
}
.tag(0)
Text("Second View")
.tabItem {
VStack {
Image("list.dash")
Text("Browse")
}
}
.tag(1)
...
}
.accentColor(Color("primaryYellow"))
私はこれを解決しようとしてかなり立ち往生しており、それは簡単なはずです。助けてください!
更新:以下のカイルの回答によれば、私はすでにこのアプローチを試しました。これは、NavConfiguratorを実装した後のナビゲーションバーのスクリーンショットです(透明効果が効いているため、バーが青く見えることに注意してください)。
SwiftUI
でコーディングを始めたとき、私は同じ問題に直面し、多くの調査の結果、解決策を見つけました。
以下のコードをSceneDelegate
クラスに配置します。
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
let newAppearance = UINavigationBarAppearance()
newAppearance.configureWithOpaqueBackground()
newAppearance.backgroundColor = .black
newAppearance.titleTextAttributes = [.foregroundColor: UIColor.white]
UINavigationBar.appearance().standardAppearance = newAppearance
//Other code for displaying the first screen
}
UINavigationBarAppearance
クラスは、ナビゲーションバーの外観を変更するために使用され、iOS 13から使用できます。
上記のコードは、すべてのコントローラーのナビゲーションバースタイルを変更します。
次は私のために働きます:
以下を変更するUINavigationControllerの拡張機能を作成します。
ナビゲーションバーのタイトルの色
import UIKit
extension UINavigationController {
override open func viewDidLoad() {
super.viewDidLoad()
let appearance = UINavigationBarAppearance()
//background color of the navigation and status bar
appearance.backgroundColor = .black
//color when the title is large
appearance.largeTitleTextAttributes.updateValue(UIColor.white, forKey: NSAttributedString.Key.foregroundColor)
//color when the title is small
appearance.titleTextAttributes.updateValue(UIColor.white, forKey: NSAttributedString.Key.foregroundColor)
// change the background- and title foregroundcolor for navigationbar
navigationBar.standardAppearance = appearance
navigationBar.scrollEdgeAppearance = appearance
navigationBar.compactAppearance = appearance
// change color of navigationbar items
navigationBar.tintColor = UIColor.white
}
}
ただし、ステータスバーの前景色は変更されません。そのため、次のことを行う必要があります。
swiftUIをインポートする
class HostingController<Content> : UIHostingController<Content> where Content : View {
@objc override dynamic open var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
}
そして、シーンデリゲートで
交換する必要があります
window.rootViewController = UIHostingController(rootView: contentView)
と
window.rootViewController = HostingController(rootView: contentView)
私はこの問題に約1時間苦労しましたが、TabViewを使用している場合、タブのビューではなく、edgesIgnoringSafeAreaをTabViewに追加する必要があることがわかりました。
TabView {
ViewA().tabItem.....
}.edgesIgnoringSafeArea(.top)
それが役に立てば幸い