Closed7

【Swift】UINavigationController(View Controllers) 0->1

yoshitakayoshitaka

UINavigationController(UIKit -> View Controllers -> )

階層コンテンツをナビゲートするためのスタックベースのスキームを定義するコンテナビューコントローラ。

class UINavigationController : UIViewController

ナビゲーションコントローラーは、ナビゲーションインターフェイスで1つ以上の子ビューコントローラーを管理するコンテナービューコントローラーです。このタイプのインターフェースでは、一度に1つの子ViewControllerのみが表示されます。ビューコントローラでアイテムを選択すると、アニメーションを使用して新しいビューコントローラが画面にプッシュされ、前のビューコントローラが非表示になります。インターフェイスの上部にあるナビゲーションバーの[戻る]ボタンをタップすると、上部のView Controllerが削除され、その下にあるViewControllerが表示されます。

ナビゲーションインターフェースを使用して、アプリによって管理される階層データの編成を模倣します。階層の各レベルで、そのレベルのコンテンツを表示するための適切な画面(カスタムビューコントローラーによって管理される)を提供します。図1は、iOSSimulatorの設定アプリケーションによって表示されるナビゲーションインターフェイスの例を示しています。最初の画面には、設定を含むアプリケーションのリストがユーザーに表示されます。アプリケーションを選択すると、そのアプリケーションの個々の設定と設定のグループが表示されます。グループを選択すると、より多くの設定などが得られます。ルートビューを除くすべての場合、ナビゲーションコントローラーには、ユーザーが階層を上に戻ることができるようにする戻るボタンがあります。

ナビゲーションコントローラーオブジェクトは、ナビゲーションスタックと呼ばれる順序付けられた配列を使用して子ビューコントローラーを管理します。アレイの最初のビューコントローラーはルートビューコントローラーであり、スタックの最下部を表します。配列の最後のViewControllerはスタックの最上位の項目であり、現在表示されているViewControllerを表します。セグエを使用するか、このクラスのメソッドを使用して、ビューコントローラーをスタックに追加したりスタックから削除したりします。ユーザーは、ナビゲーションバーの戻るボタンを使用するか、左端のスワイプジェスチャを使用して、最上位のViewControllerを削除することもできます。

ナビゲーションコントローラーは、インターフェイスの上部にあるナビゲーションバーと、インターフェイスの下部にあるオプションのツールバーを管理します。ナビゲーションバーは常に存在し、ナビゲーションコントローラー自体によって管理されます。ナビゲーションコントローラーは、子ビューコントローラーによって提供されるコンテンツを使用してナビゲーションバーを更新します。 isToolbarHiddenプロパティがfalseの場合、ナビゲーションコントローラは同様に、最上位のViewControllerによって提供されるコンテンツでツールバーを更新します。

ナビゲーションコントローラーは、その動作をデリゲートオブジェクトと調整します。デリゲートオブジェクトは、View Controllerのプッシュまたはポップをオーバーライドし、カスタムアニメーショントランジションを提供し、ナビゲーションインターフェイスの優先方向を指定できます。提供するデリゲートオブジェクトは、UINavigationControllerDelegateプロトコルに準拠している必要があります。

図2は、ナビゲーションコントローラーとそれが管理するオブジェクトとの関係を示しています。これらのオブジェクトにアクセスするには、ナビゲーションコントローラーの指定されたプロパティを使用します。

yoshitakayoshitaka

ナビゲーションコントローラービュー
ナビゲーションコントローラーはコンテナービューコントローラーです。つまり、他のビューコントローラーのコンテンツをその中に埋め込みます。 ナビゲーションコントローラのビューには、そのビュープロパティからアクセスします。 このビューには、ナビゲーションバー、オプションのツールバー、および最上位のViewControllerに対応するコンテンツビューが組み込まれています。 図3は、これらのビューを組み立てて、ナビゲーションインターフェイス全体を表示する方法を示しています。 (この図では、ナビゲーションインターフェイスはタブバーインターフェイス内にさらに埋め込まれています。)ナビゲーションバーとツールバービューのコンテンツは変更されますが、ビュー自体は変更されません。 実際に変更される唯一のビューは、ナビゲーションスタックの最上位のビューコントローラーによって提供されるカスタムコンテンツビューです。

iOS 7以降では、コンテンツビューがナビゲーションバーと重なっているため、ViewControllerコンテンツを設計する際にはそのスペースを考慮する必要があります。

ナビゲーションコントローラーは、ナビゲーションバーとオプションのナビゲーションツールバーの作成、構成、および表示を管理します。ナビゲーションバーの外観関連のプロパティをカスタマイズすることは許可されていますが、フレーム、境界、またはアルファ値を直接変更しないでください。 UINavigationBarをサブクラス化する場合は、init(navigationBarClass:toolbarClass :)メソッドを使用してナビゲーションコントローラーを初期化する必要があります。ナビゲーションバーを表示または非表示にするには、isNavigationBarHiddenプロパティまたはsetNavigationBarHidden(_:animated :)メソッドを使用します。

ナビゲーションコントローラーは、ナビゲーションスタック上のビューコントローラーに関連付けられたナビゲーションアイテムオブジェクト(UINavigationItemクラスのインスタンス)を使用して、ナビゲーションバーのコンテンツを動的に構築します。ナビゲーションバーの全体的な外観をカスタマイズするには、UIAppearanceAPIを使用します。したがって、ナビゲーションバーの内容を変更するには、カスタムViewControllerのナビゲーション項目を構成する必要があります。ナビゲーションアイテムの詳細については、UINavigationItemを参照してください。

yoshitakayoshitaka

ナビゲーションバーの更新

トップレベルのViewControllerが変更されるたびに、NavigationControllerはそれに応じてナビゲーションバーを更新します。 具体的には、ナビゲーションコントローラは、左、中央、右の3つのナビゲーションバー位置のそれぞれに表示されるバーボタン項目を更新します。 バーボタンアイテムは、UIBarButtonItemクラスのインスタンスです。 必要に応じて、カスタムコンテンツを使用してアイテムを作成することも、標準のシステムアイテムを作成することもできます。

ナビゲーションバーの色合いは、ナビゲーションバー自体のプロパティによって制御されます。 tintColorプロパティを使用してバー内のアイテムの色合いの色を変更し、barTintColorプロパティを使用してバー自体の色合いの色を変更します。 ナビゲーションバーは、現在表示されているViewControllerから色合いの色を継承しません。

ナビゲーションバーの詳細については、UINavigationBarを参照してください。 バーボタンアイテムの作成方法の詳細については、UIBarButtonItemを参照してください。

左のアイテム

ナビゲーションスタックのルートViewControllerを除くすべての場合、ナビゲーションバーの左側にある項目は、前のViewControllerに戻るナビゲーションを提供します。この左端のボタンの内容は次のように決定されます。

新しいトップレベルのViewControllerにカスタムの左バーボタンアイテムがある場合、そのアイテムが表示されます。カスタムの左バーボタンアイテムを指定するには、ViewControllerのナビゲーションアイテムのleftBarButtonItemプロパティを設定します。

トップレベルのViewControllerにカスタムの左バーボタンアイテムがないが、前のView ControllerのナビゲーションアイテムのbackBarButtonItemプロパティにオブジェクトがある場合、ナビゲーションバーにはそのアイテムが表示されます。

カスタムバーボタンアイテムがどちらのビューコントローラでも指定されていない場合、デフォルトの戻るボタンが使用され、そのタイトルは前のビューコントローラ(つまり、1レベル下のビューコントローラ)のtitleプロパティの値に設定されます。スタック。 (ナビゲーションスタックにView Controllerが1つしかない場合、戻るボタンは表示されません。)

戻るボタンのタイトルが長すぎて使用可能なスペースに収まらない場合は、ナビゲーションバーで実際のボタンのタイトルを「戻る」という文字列に置き換えることができます。 ナビゲーションバーは、戻るボタンが前のViewControllerによって提供されている場合にのみこれを行います。 新しいトップレベルのViewControllerにカスタムの左バーボタンアイテム(ナビゲーションアイテムのleftBarButtonItemまたはleftBarButtonItemsプロパティ内のオブジェクト)がある場合、ナビゲーションバーはボタンのタイトルを変更しません。

ミドルアイテム

ナビゲーションコントローラーは、ナビゲーションバーの中央を次のように更新します。

新しいトップレベルのビューコントローラにカスタムタイトルビューがある場合、ナビゲーションバーにはデフォルトのタイトルビューの代わりにそのビューが表示されます。 カスタムタイトルビューを指定するには、ViewControllerのナビゲーションアイテムのtitleViewプロパティを設定します。

カスタムタイトルビューが設定されていない場合、ナビゲーションバーにはビューコントローラのデフォルトタイトルを含むラベルが表示されます。 このラベルの文字列は通常、ViewController自体のtitleプロパティから取得されます。 ビューコントローラに関連付けられているタイトルとは異なるタイトルを表示する場合は、代わりにビューコントローラのナビゲーションアイテムのtitleプロパティを設定します。

右のアイテム

ナビゲーションコントローラーは、ナビゲーションバーの右側を次のように更新します。

新しいトップレベルのViewControllerにカスタムの右バーボタンアイテムがある場合、そのアイテムが表示されます。 カスタムの右バーボタンアイテムを指定するには、ViewControllerのナビゲーションアイテムのrightBarButtonItemプロパティを設定します。

カスタムの右バーボタン項目が指定されていない場合、ナビゲーションバーはバーの右側に何も表示しません。

yoshitakayoshitaka

ツールバーの表示

ナビゲーションコントローラーオブジェクトは、ビュー階層内のオプションのツールバーを管理します。表示されると、このツールバーはアクティブなViewControllerのtoolbarItemsプロパティから現在のアイテムのセットを取得します。アクティブなViewControllerが変更されると、ナビゲーションコントローラは、新しいView Controllerに一致するようにツールバー項目を更新し、必要に応じて新しい項目を所定の位置にアニメーション化します。

ナビゲーションツールバーはデフォルトで非表示になっていますが、ナビゲーションコントローラーオブジェクトのsetToolbarHidden(_:animated :)メソッドを呼び出すことで、ナビゲーションインターフェイスに表示できます。すべてのViewControllerがツールバー項目をサポートしているわけではない場合、デリゲートオブジェクトはこのメソッドを呼び出して、後続のプッシュおよびポップ操作中にツールバーの表示を切り替えることができます。カスタムUIToolbarサブクラスを使用するには、init(navigationBarClass:toolbarClass :)メソッドを使用してナビゲーションコントローラーを初期化します。カスタムツールバーとナビゲーションバーのサブクラスを使用してナビゲーションコントローラーを作成する場合は、ナビゲーションコントローラーを画面に表示する前に、ビューコントローラーを押して設定する必要があることに注意してください。

さまざまな環境への適応

ナビゲーションインターフェイスは、水平方向にコンパクトな環境と水平方向に通常の環境の両方で同じままです。 2つの環境を切り替えると、ナビゲーションコントローラーのビューのサイズのみが変更されます。 ナビゲーションコントローラは、ビュー階層やビューのレイアウトを変更しません。

ナビゲーションスタック上のViewController間でセグエを構成する場合、標準のShowおよびShowDetailセグエは次のように動作します。

Show segue:ナビゲーションコントローラは、指定されたViewControllerをナビゲーションスタックにプッシュします。

詳細表示セグエ-ナビゲーションコントローラーは、指定されたビューコントローラーをモーダルに表示します。

他のセグエタイプの動作は変更されていません。

インターフェイスの動作

ナビゲーションコントローラーは、そのインターフェイスで次の動作をサポートしています。

サポートされているインターフェイスの向き-ナビゲーションコントローラオブジェクトは、サポートされているインターフェイスの向きを決定するときに、ナビゲーションスタック上のViewControllerを参照しません。 iPhoneでは、ナビゲーションコントローラーは縦向きを除くすべての向きを逆さまにサポートします。 iPadでは、ナビゲーションコントローラーはすべての方向をサポートします。 ナビゲーションコントローラーにデリゲートオブジェクトがある場合、デリゲートは、navigationControllerSupportedInterfaceOrientations(_ :)メソッドを使用して、サポートされている別の方向のセットを指定できます。

プレゼンテーションコンテキスト-ナビゲーションコントローラは、モーダルに表示されるビューコントローラのプレゼンテーションコンテキストを定義します。 モーダル遷移スタイルがUIModalPresentationStyle.currentContextまたはUIModalPresentationStyle.overCurrentContextの場合、ナビゲーションスタック内のビューコントローラーからのモーダルプレゼンテーションは、ナビゲーションインターフェイス全体をカバーします。

状態の保存

ナビゲーションコントローラーのrestorementIdentifierプロパティに値を割り当てると、ナビゲーションコントローラーはそれ自体と子ビューコントローラーをナビゲーションスタックに保持しようとします。 ナビゲーションコントローラーはスタックの一番下から始まり、上に移動して、有効な復元ID文字列も持つ各ビューコントローラーをエンコードします。 次の起動サイクル中に、ナビゲーションコントローラは、保存されたViewControllerを保存されたのと同じ順序でナビゲーションスタックに復元します。

ナビゲーションスタックにプッシュする子ビューコントローラーは、同じ復元識別子を使用する場合があります。 ナビゲーションコントローラは、各子の復元パスが一意であることを確認するために、追加情報を自動的に保存します。

状態の保存と復元の仕組みの詳細については、「起動後のアプリのUIの保持」を参照してください。

yoshitakayoshitaka

重要な内容ピックアップ

  • ナビゲーションコントローラのビューには、そのビュープロパティからアクセスします。 このビューには、ナビゲーションバー、オプションのツールバー、および最上位のViewControllerに対応するコンテンツビューが組み込まれています。

  • ナビゲーションバーの外観関連のプロパティをカスタマイズすることは許可されていますが、フレーム、境界、またはアルファ値を直接変更しないでください。

  • ナビゲーションバーを表示または非表示にするには、isNavigationBarHiddenプロパティまたはsetNavigationBarHidden(_:animated :)メソッドを使用します。

  • ナビゲーションコントローラーは、ナビゲーションスタック上のビューコントローラーに関連付けられたナビゲーションアイテムオブジェクト(UINavigationItemクラスのインスタンス)を使用して、ナビゲーションバーのコンテンツを動的に構築します。ナビゲーションバーの全体的な外観をカスタマイズするには、UIAppearanceAPIを使用します。したがって、ナビゲーションバーの内容を変更するには、カスタムViewControllerのナビゲーション項目を構成する必要があります。

  • トップレベルのViewControllerが変更されるたびに、NavigationControllerはそれに応じてナビゲーションバーを更新します。

  • ナビゲーションバーの色合いは、ナビゲーションバー自体のプロパティによって制御されます。 tintColorプロパティを使用してバー内のアイテムの色合いの色を変更し、barTintColorプロパティを使用してバー自体の色合いの色を変更します。 ナビゲーションバーは、現在表示されているViewControllerから色合いの色を継承しません。

  • 新しいトップレベルのViewControllerにカスタムの左バーボタンアイテムがある場合、そのアイテムが表示されます。カスタムの左バーボタンアイテムを指定するには、ViewControllerのナビゲーションアイテムのleftBarButtonItemプロパティを設定します。トップレベルのViewControllerにカスタムの左バーボタンアイテムがないが、前のView ControllerのナビゲーションアイテムのbackBarButtonItemプロパティにオブジェクトがある場合、ナビゲーションバーにはそのアイテムが表示されます。カスタムバーボタンアイテムがどちらのビューコントローラでも指定されていない場合、デフォルトの戻るボタンが使用され、そのタイトルは前のビューコントローラ(つまり、1レベル下のビューコントローラ)のtitleプロパティの値に設定されます。スタック。 (ナビゲーションスタックにView Controllerが1つしかない場合、戻るボタンは表示されません。)

  • 新しいトップレベルのビューコントローラにカスタムタイトルビューがある場合、ナビゲーションバーにはデフォルトのタイトルビューの代わりにそのビューが表示されます。 カスタムタイトルビューを指定するには、ViewControllerのナビゲーションアイテムのtitleViewプロパティを設定します。

  • 新しいトップレベルのViewControllerにカスタムの右バーボタンアイテムがある場合、そのアイテムが表示されます。 カスタムの右バーボタンアイテムを指定するには、ViewControllerのナビゲーションアイテムのrightBarButtonItemプロパティを設定します。

  • カスタムの右バーボタン項目が指定されていない場合、ナビゲーションバーはバーの右側に何も表示しません。

yoshitakayoshitaka
  • ナビゲーションコントローラーは、ナビゲーションスタック上のビューコントローラーに関連付けられたナビゲーションアイテムオブジェクト(UINavigationItemクラスのインスタンス)を使用して、ナビゲーションバーのコンテンツを動的に構築します。ナビゲーションバーの全体的な外観をカスタマイズするには、UIAppearanceAPIを使用します。したがって、ナビゲーションバーの内容を変更するには、カスタムViewControllerのナビゲーション項目を構成する必要があります。

  • A navigation controller builds the contents of the navigation bar dynamically using the navigation item objects (instances of the UINavigationItem class) associated with the view controllers on the navigation stack. To customize the overall appearance of a navigation bar, use UIAppearance APIs. To change the contents of the navigation bar, you must therefore configure the navigation items of your custom view controllers. For more information about navigation items, see UINavigationItem.

yoshitakayoshitaka

NavigationControllerでの画面遷移

func pushViewController(UIViewController, animated: Bool)
Pushes a view controller onto the receiver’s stack and updates the display.
// ビューコントローラをレシーバーのスタックにプッシュし、表示を更新します。

func popViewController(animated: Bool) -> UIViewController?
Pops the top view controller from the navigation stack and updates the display.
// ナビゲーションスタックからトップビューコントローラーをポップし、表示を更新します。

func popToRootViewController(animated: Bool) -> [UIViewController]?
Pops all the view controllers on the stack except the root view controller and updates the display.
// ルートビューコントローラーを除くスタック上のすべてのビューコントローラーをポップし、表示を更新します

func popToViewController(UIViewController, animated: Bool) -> [UIViewController]?
Pops view controllers until the specified view controller is at the top of the navigation stack.
// 指定されたViewControllerがナビゲーションスタックの最上位になるまで、ViewControllerをポップします。

var interactivePopGestureRecognizer: UIGestureRecognizer?
The gesture recognizer responsible for popping the top view controller off the navigation stack.
// トップビューコントローラをナビゲーションスタックからポップするジェスチャレコグナイザ。
このスクラップは2021/05/16にクローズされました