最近、Xcodeを11.4に更新しました。デバイスでアプリを実行すると、ストーリーボードから設定されていると、すべてのナビゲーションアイテムのタイトルが完全に黒くなっていることに気付きました。
コードから変更することはできません。次のコード行は機能しなくなります
self.navigationController?.navigationBar.titleTextAttributes = [.foregroundColor: UIColor.white]
私はそれをいくつかのiOS 13のものを使用してのみ動作させるUINavigationBarAppearance
@available(iOS 13.0, *)
private func setupNavigationBar() {
let app = UINavigationBarAppearance()
app.titleTextAttributes = [.foregroundColor: UIColor.white]
app.backgroundColor = Constants.Color.barColor
self.navigationController?.navigationBar.compactAppearance = app
self.navigationController?.navigationBar.standardAppearance = app
self.navigationController?.navigationBar.scrollEdgeAppearance = app
self.navigationController?.navigationBar.titleTextAttributes = [.foregroundColor: UIColor.white]
}
なぜ誰かが私に理由を説明できますか???これは重大なバグですか、それとも新しい隠し機能ですか?
回避策は必要ありません。XcodeInterface Builderのバグです。 Apple Xcode 11.4.1のリリースアップデート
Apple開発者リリースノートから
インターフェースビルダー
Xcode 11.4でビルドするときにストーリーボードとXIBドキュメントで設定された一部のUINavigationBar外観プロパティが無視される問題を修正しました。 (60883063)(FB7639654)
https://developer.Apple.com/documentation/xcode_release_notes/xcode_11_4_1_release_notes
3/25のStu Carneyの応答と同様に、実装の詳細をさらにいくつか追加しました。
INavigationControllerのサブクラスを作成します。以下をviewWillAppearに追加します。
let isDarkMode = UserDefaults.standard.bool(forKey: "DarkMode")
let titleColor: UIColor = isDarkMode ? .white : .black
let navBarColor: UIColor = isDarkMode ? .black : .white
let tintColor: UIColor = isDarkMode ? .yellow : .red //back button text and arrow color, as well as right bar button item
if #available(iOS 13.0, *) {
let appearance = UINavigationBarAppearance()
appearance.configureWithOpaqueBackground()
appearance.backgroundColor = navBarColor
appearance.titleTextAttributes = [.foregroundColor: titleColor]
appearance.largeTitleTextAttributes = [.foregroundColor: titleColor]
self.navigationBar.standardAppearance = appearance
self.navigationBar.scrollEdgeAppearance = appearance
self.navigationBar.compactAppearance = appearance // For iPhone small navigation bar in landscape.
self.navigationBar.tintColor = tintColor //changes back button text and arrow color, as well as right bar button item
} else {
self.navigationBar.barTintColor = navBarColor
self.navigationBar.tintColor = tintColor
self.navigationBar.titleTextAttributes = [.foregroundColor: titleColor]
self.navigationBar.largeTitleTextAttributes = [.foregroundColor: titleColor]
}
次に、preferredStatusBarStyleをオーバーライドします。
override var preferredStatusBarStyle: UIStatusBarStyle {
let isDarkMode = UserDefaults.standard.bool(forKey: "DarkMode")
return isDarkMode ? .lightContent : .default
}
UISwitch IBActionやセレクターメソッドなどから、ナビゲーションバーとステータスバーを動的に更新する場合は、以下を追加します。
navigationController?.loadView()
navigationController?.topViewController?.setNeedsStatusBarAppearanceUpdate()
また、すべてのナビゲーションバーとバーボタンをIBのデフォルトの色に設定してください。 Xcodeには、IBの色がプログラムで設定された色を上書きするというバグがあるようです。
私の場合、Xcodeを11.3から11.4にアップグレードした後、このバグが発生しました。そのため、ナビゲーションバーで画像を背景として設定するには、コードを変更してブローする必要があります。
if #available(iOS 13.0, *) {
let appearance = UINavigationBarAppearance()
appearance.configureWithOpaqueBackground()
let backgroundImage = UIImage(named: "{NAVBAR_IMAGE_NAME}")?.resizableImage(withCapInsets: UIEdgeInsets.zero, resizingMode: .stretch)
appearance.backgroundImage = backgroundImage
self.navigationController?.navigationBar.compactAppearance = appearance
self.navigationController?.navigationBar.standardAppearance = appearance
self.navigationController?.navigationBar.scrollEdgeAppearance = appearance
} else {
self.navigationController?.navigationBar.barTintColor = Utils.themeColor
let backgroundImage = UIImage(named: "{NAVBAR_IMAGE_NAME}")?.resizableImage(withCapInsets: UIEdgeInsets.zero, resizingMode: .stretch)
self.navigationController?.navigationBar.setBackgroundImage(backgroundImage, for: .default)
self.navigationController?.navigationBar.shadowImage = UIImage()
}