web-dev-qa-db-ja.com

Xcode 11.4。 Navigationのタイトルカラーがストーリーボードから黒になりました

最近、Xcodeを11.4に更新しました。デバイスでアプリを実行すると、ストーリーボードから設定されていると、すべてのナビゲーションアイテムのタイトルが完全に黒くなっていることに気付きました。 enter image description here

コードから変更することはできません。次のコード行は機能しなくなります

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]
    }

なぜ誰かが私に理由を説明できますか???これは重大なバグですか、それとも新しい隠し機能ですか?

56
Tudor Popa

回避策は必要ありません。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
NinjaDeveloper

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の色がプログラムで設定された色を上書きするというバグがあるようです。

0
Josh R

私の場合、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()
}
0
Reza Dehnavi