web-dev-qa-db-ja.com

UISearchControllerを追加すると、ナビゲーションバーが白くなる

UISearchControllerをUINavigationControllerからUINavigationItemに追加すると、ビューが読み込まれると白になり、ユーザーが検索バーをクリックしたときに指定された色に変わります。これはiOS 13.1以降に起こりました。このビデオは動作を示しています:

https://imgur.com/wn5zbnJ

私のコードは、NavigationController + TableViewControllerを含むシンプルなストーリーボードで構成されており、NavigationControllerには色が割り当てられています。 enter image description here

ViewControllerは次のコードで構成されています。

class ViewController: UITableViewController {

    let searchController = UISearchController(searchResultsController: nil)

    override func viewDidLoad() {
        super.viewDidLoad()

        searchController.hidesNavigationBarDuringPresentation = false
        searchController.obscuresBackgroundDuringPresentation = false
        navigationItem.searchController = searchController
    }
}

また、これらのキーをinfo.plistファイルに追加して、アプリを強制的にライトモードにしましたが、これらを削除しても、同じ動作が引き続き存在します。

<key>UIUserInterfaceStyle</key>
<string>Light</string>

これは、iOS 13.1ベータ1を実行しているiPhone XS Maxでテストされました。これは予想される動作ですか、修正が必要なバグですか?

9
Devxln

IOS 13で新しいUINavigationBarAppearanceを使用する必要があるようです。これをviewDidLoadに追加してみてください。

let appearance = UINavigationBarAppearance()
appearance.backgroundColor = .systemRed
appearance.titleTextAttributes = [NSAttributedString.Key.foregroundColor : UIColor.white]
navigationItem.standardAppearance = appearance
navigationItem.scrollEdgeAppearance = appearance

また、おそらくsearchField backgroundColorも設定する必要があります。

let searchField = searchController.searchBar.searchTextField
searchField.backgroundColor = .systemBackground
17
Lobo

これはiOS 13.1のバグのようです。具体的には、ナビゲーションバーのiOS 13固有の新しい外観(UINavigationBarAppearance)があり、スクロールビューが上にスクロールされたときの外観とデフォルトの状態を指定します。通常、このような変更は、アプリが対応するSDK(iOS 13.1)でビルドされたときにのみ有効になります。ただし、iOS 12 SDKを使用してアプリをビルドした場合にも動作が発生するバグがあるようです。

参照: https://developer.Apple.com/documentation/uikit/uinavigationbarappearance

更新:ここに回避策があります: https://itnext.io/fixing-issues-caused-by-future-sdks-ae0896384abf

基本的に、アプリがiOS 13を実行しているデバイスで実行されている場合、SwiftでNSClassFromString()を介して新しいクラスのインスタンスを作成し、objective-cランタイムマジックを使用してナビゲーションバーを構成できます。

6
Scott Ahten

質問の内容は明確ではありませんでした。ただし、必要に応じて、navigationBarにsearchbarを追加し、特定の色を使用すると、役立つ場合があります。

ナビゲーションバーに検索バーを配置するプロセス:

let searchController = UISearchController(searchResultsController: nil)
navigationItem.searchController = searchController

必要なコントローラを「searchResultsController」の値に追加できます。

背景色を特定の色に設定する場合は、バーの色合いをStoryborad->ナビゲーションバー->ナビゲーションバー属性検査から変更できます。

また、AppDelegate.Swiftファイルの以下のコードでも同じことが行われます。 「tintcolor」と「titletextcolor」にコメント

  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.

        let navigationBarAppearace = UINavigationBar.appearance()
        navigationBarAppearace.barTintColor = UIColor.blue

        // navigationBarAppearace.tintColor = UIColor.red
        //navigationBarAppearace.titleTextAttributes = [.foregroundColor: UIColor.red]
        return true
    }
3
Yunus Karakaya

同じ問題が発生しており、すでにAppleにレーダーが開かれています。それでも、backgroundColorをUINavigationBarの外観に設定すると、プルダウンして検索バーを表示したときにナビゲーションバーが透明になるのではなく、その色になりますが、ステータスバーは白のままです。

UINavigationBar.appearance().tintColor = .white
UINavigationBar.appearance().barTintColor = .blue
UINavigationBar.appearance().titleTextAttributes = [NSAttributedString.Key.foregroundColor : UIColor.white]
UINavigationBar.appearance().backgroundColor = .red

これはその振る舞いを軽減しようとするコードですが、ステータスバーのことを聞いてくれます

0
Lorenzo V