web-dev-qa-db-ja.com

iOS 13のUISplitViewControllerの詳細ペインの新しいUINavigationBarの外観

IOS 13では、ナビゲーションコントローラーでスクロール可能なルートビューコントローラー(UITableViewControllerなど)をセットアップし、そのナビゲーションコントローラーをUISplitViewControllerの詳細ペインに配置すると、スクロール可能なコンテンツが表示されているときにナビゲーションバーの背景が表示されません。頂点で。

これは、マスター/詳細テンプレートに基づいて新しいiOSプロジェクトを作成することで確認できます。次に、詳細ペインのナビゲーションコントローラー内でUITableViewControllerを使用するようにストーリーボードを変更します。デバイス/シミュレーターをライトアピアランスモードにします(ダークモードよりも問題がよくわかります)。アプリを実行し、ナビゲーションバー領域がテーブルビューの背景と同じ色であることを確認します。テーブルビューを上にスクロールすると、ナビゲーションバーの色が標準のライトグレーに変わります。テーブルビューが上部に戻り、ナビゲーションバーの色が再び消えます。

分割ビューコントローラーの詳細ペインでのみこれを確認しました。

この「機能」をオフにして、分割バーコントローラーの詳細ペイン以外の場所で使用される他のすべてのナビゲーションバーと同じように、ナビゲーションバーを通常のように表示するにはどうすればよいですか?

UISplitViewControllerまたはUISplitViewControllerDelegateに関連するAPIの変更はありません。 UINavigationControllerにも何もありません。

少し掘り下げた後、回避策を1つ見つけましたが、これを回避する方法を見つけたいです。

UINavigationBarクラスには、外観を設定するための新しいプロパティがいくつかあります。奇妙なことに、これらのいずれもUINavigationBarのドキュメントの「ナビゲーションバーの外観のカスタマイズ」では言及されていません。

IOS 13には3つの新しいプロパティがあります。

  • standardAppearance
  • compactAppearance
  • scrollEdgeAppearance

3つすべてのタイプはUINavigationBarAppearanceです。

デフォルトでは、最初のものだけが設定されています。

scrollEdgeAppearancenilですが、分割コントローラーの詳細ペインは、backgroundColorclearに設定されているかのように機能します。

したがって、回避策は、次の行をナビゲーションコントローラのルートビューコントローラのviewDidLoadメソッドに追加することです。

navigationController?.navigationBar.scrollEdgeAppearance = navigationController?.navigationBar.standardAppearance

これがこの1つのケースでのみ必要なのはなぜですか?このコードを追加する以外にもっと正しい解決策はありますか?

Appleのアプリ(少なくともメール、メモ、ファイル)はどれもこの「機能」を使用していないようです。

19
rmaddy

見つけた回避策は、この動作を無効にする「公式」の方法です。これは、AppleのiOSシステムエクスペリエンスチームに所属するDavid Duncanの Twitterのスレッド で説明されています。

uINavigationBarが完全に展開されたときに何が起こるかを制御するには、scrollEdgeAppearanceを設定します。 standardAppearanceとscrollEdgeAppearanceを同じ値に設定すると、変化しないバーが表示されます。

この動作を無効にしないAppleアプリは設定アプリです。

8
Jordan H