IOS 13では、ナビゲーションコントローラーでスクロール可能なルートビューコントローラー(UITableViewControllerなど)をセットアップし、そのナビゲーションコントローラーをUISplitViewControllerの詳細ペインに配置すると、スクロール可能なコンテンツが表示されているときにナビゲーションバーの背景が表示されません。頂点で。
これは、マスター/詳細テンプレートに基づいて新しいiOSプロジェクトを作成することで確認できます。次に、詳細ペインのナビゲーションコントローラー内でUITableViewControllerを使用するようにストーリーボードを変更します。デバイス/シミュレーターをライトアピアランスモードにします(ダークモードよりも問題がよくわかります)。アプリを実行し、ナビゲーションバー領域がテーブルビューの背景と同じ色であることを確認します。テーブルビューを上にスクロールすると、ナビゲーションバーの色が標準のライトグレーに変わります。テーブルビューが上部に戻り、ナビゲーションバーの色が再び消えます。
分割ビューコントローラーの詳細ペインでのみこれを確認しました。
この「機能」をオフにして、分割バーコントローラーの詳細ペイン以外の場所で使用される他のすべてのナビゲーションバーと同じように、ナビゲーションバーを通常のように表示するにはどうすればよいですか?
UISplitViewController
またはUISplitViewControllerDelegate
に関連するAPIの変更はありません。 UINavigationController
にも何もありません。
少し掘り下げた後、回避策を1つ見つけましたが、これを回避する方法を見つけたいです。
UINavigationBar
クラスには、外観を設定するための新しいプロパティがいくつかあります。奇妙なことに、これらのいずれもUINavigationBar
のドキュメントの「ナビゲーションバーの外観のカスタマイズ」では言及されていません。
IOS 13には3つの新しいプロパティがあります。
standardAppearance
compactAppearance
scrollEdgeAppearance
3つすべてのタイプはUINavigationBarAppearance
です。
デフォルトでは、最初のものだけが設定されています。
scrollEdgeAppearance
はnil
ですが、分割コントローラーの詳細ペインは、backgroundColor
がclear
に設定されているかのように機能します。
したがって、回避策は、次の行をナビゲーションコントローラのルートビューコントローラのviewDidLoad
メソッドに追加することです。
navigationController?.navigationBar.scrollEdgeAppearance = navigationController?.navigationBar.standardAppearance
これがこの1つのケースでのみ必要なのはなぜですか?このコードを追加する以外にもっと正しい解決策はありますか?
Appleのアプリ(少なくともメール、メモ、ファイル)はどれもこの「機能」を使用していないようです。
見つけた回避策は、この動作を無効にする「公式」の方法です。これは、AppleのiOSシステムエクスペリエンスチームに所属するDavid Duncanの Twitterのスレッド で説明されています。
uINavigationBarが完全に展開されたときに何が起こるかを制御するには、scrollEdgeAppearanceを設定します。 standardAppearanceとscrollEdgeAppearanceを同じ値に設定すると、変化しないバーが表示されます。
この動作を無効にしないAppleアプリは設定アプリです。