iOS 9(Swift)のAdaptive Split View ControllerおよびPopover。 パート1



太古の昔から、iOSのSplit View ControllerPopoverはiPadでのみ利用可能でした。
iOS 8以降では、 サイズクラスの概念とその適応動作により、iPadとiPhoneの両方で動作するようになりました。 ただし、Appleが提案する「すぐに使用できる」自動適応はほとんどの場合私たちにUISplitViewControllerDelegateず、デリゲートメソッドUISplitViewControllerDelegateおよびUIPopoverPresentationControllerDelegateを使用して少し追加のコードを記述するUISplitViewControllerDelegateありUIPopoverPresentationControllerDelegate 。 この記事では、クラウドベースの写真ストレージサービスであるFlickr.comサーバーと連携する非常にシンプルで実用的なアプリケーションを使用して、 Split View ControllerPopoverの適応機能を調べます。 データがサーバーから読み取られ、リンクされたテーブルとイメージの形式で表示される一般的なケースであるため、このタスク自体には大きな実用的な意味があります。 途中で、計算されたプロパティc {get}および{set}didSet{}プロパティのオブザーバ、 didSet{}関数map, flatMap, filter 、コンテキストからの型推論、および関数のオーバーロードなど、Swiftのライブ構文構築を示します。 SwiftとObjective-Cコードの併用、構造struct構造の使用、 NSUserDefaultsストレージの使用など。 それでも、この記事では、Adaptive Split View ControllerPopoverのより複雑な構成に焦点を当てています。
その結果、この記事のすべてのアプリケーションを、同様のタスクを使用してアプリケーションを開発するためのテンプレートとして使用できます。


そのため、iOSの新しい哲学によれば、画面のサイズクラスに応じて、ユーザーインターフェイス(UI)をあらゆる種類のデバイスにすばやく構成できます。
iOS 8でさまざまなデバイスを分類するために、 サイズクラスの概念が導入されました。 4つのサイズクラスのみ:

View ControllerSplit View ControllerまたはPopover )は、特定の幅と高さを持つサイズクラス環境に常に存在します。 現在、 サイズクラスCompactまたはRegularのいずれかです。



iPadのフルサイズのView Controllerは、両方向(水平および垂直)で常に標準です。 iPhone 6+およびiPhone 6s +より前のすべてのiPhoneでは、水平サイズは常に(ポ​​ートレートモードとランドスケープモードの両方で) コンパクトで、垂直サイズはポートレートモードで標準 、ランドスケープモードでコンパクトでした。 大型のiPhone 6+およびiPhones 6s +の登場により、他のiPhoneとは異なり、横長モードで標準になりました。これにより、本格的なSplit View Controllerの使用を横長モードのiPhone 6+およびiPhones 6s +に拡張する理由が得られました。
アプリケーションの4つの状況すべてに対してさまざまなインターフェイスを作成するのはあまり便利ではありません。 したがって、Xcode 7には、Any(w Any h Any )と呼ばれる別のサイズクラスがあり 、ユニバーサルアプリケーションを設計するときに使用します。



iOS 7でユニバーサルアプリケーションを作成する場合、異なるタイプのコントローラー上に構築された2つの完全に異なるユーザーインターフェイスを使用する必要がありました(前のスタンフォードCS193Pコース2013年秋-2014年冬のPhotomaniaユニバーサルURLアプリケーションのストーリーボードを以下に示します。 ):
iPadのSplit View Controller
Main_iPad.storyboard


iPhoneのナビゲーションコントローラー
Main_iPhone.storyboard



Photomania Universal URLアプリは、 Flickrサーバーに最新の写真を要求し、それらの写真を撮影した写真家のリストを編集して表示します。 写真家をクリックすると、彼が撮影した写真のリストが表に表示されます。 次に、リスト内の任意の写真をクリックして、写真のフルサイズの画像その画像のURLの両方を取得できます。
このアプリがコンパクト幅デバイスでどのように機能するかを次に示します。


そして、これが通常の幅のデバイスでどのように機能するかです:



バックグラウンドのこのアプリは、 Flickrサーバーに常に最新の写真を照会し、 Core Dataデータベースにアップロードします。 画面上のカメラマンのリストは、このデータの外観を追跡します。このデータは常に自動的に更新されます。 このアプリはiOS 7用に設計され、Objective-Cで記述されています。 その実装には、2つのストーリーボードが含まれていました。1つはiPhone用で、もう1つはiPad用です(上記参照)。 それは物事の順序であり、Autolayoutメカニズムを使用する以外の適応性のあるインターフェースの話はありませんでした。
ただし、このようにiOS 7用に設計されたPhotomania Universal URLアプリケーションは、iOS 9のすべてのデバイスで正しく動作しません。iPhone5sおよび古いiPhoneでは、画面の上下に黒いバーが表示されます。
したがって、タスクは、Swift上のiOS 9用にこのアプリケーションの最新の適応UIを作成することでした。 これは、iOS 8から適応型になったSplit View Controllerコンテナーを使用して解決されます。 つまり、1つのSplit View Controllerで 、iPhone用とiPad用の2つの異なるアーキテクチャを制御できます。

iOS 9でアダプティブインターフェイスを取得するには、 Split View Controllerでストーリーボードファイルを選択し、ファイルインスペクターでサイズクラス自動レイアウトモードを指定する必要があります。


Show Detailタイプの新しい適応セグエを追加します。


レスポンシブストーリーボードは、次の2つの点を除いて、iOS 7のiPadのストーリーボードに非常に似ています。


次に、さまざまなデバイスでアダプティブSplit View Controllerの動作を調査する必要があり、通常の機能から動作が逸脱する場合は、コードに特定の追加を行います。 これらのアドオンの数は、 MasterおよびDetailに含まれる要素によって異なります。 開発者の視点から、 マスターの複雑さが異なる5つの興味深いケースをリストします。 詳細はどこでも同じですImageViewController Controllerに挿入され、写真画像を表示するように設計された唯一のImageViewController

1.クラシックバージョン: Navigation Controllerに挿入されたMasterの 1つの要素(多くの場合、これはTable View Controller-Githubの AdaptiveSplitViewController1Swiftアプリケーション。


2. Navigation Controllerに挿入された多くのTable View Controller要素-Githubの AdaptiveSplitViewController2Swiftアプリケーション。


3. マスターとしてのTab Bar Controller - Github上のAdaptiveSplitViewController3Swiftアプリケーション。


4.異なるサイズクラスを持つデバイスの異なるUIと異なるユーザークラスのケースはここでは考慮されませんが、アイデアは「iOS 9の2つのストーリーボードを備えた適応インターフェイス」で見つけることができます。

5.アダプティブポップオーバー-Github上のAdaptiveSplitViewController4Swiftアプリケーション。


追加の修正の必要性を理解する最も簡単な方法は、面倒なPhotomania Universal URLアプリケーションでCore DataのバックグラウンドでFlickr写真を「スワップ」するのではなく、 Flickrサーバーにある写真でも機能する非常にシンプルなアプリケーションである場合です。 これらの写真に関する情報はアプリケーションで非同期に読み取られ、ユーザーが特定の写真を選択した後、そのフルスケールの画像を表示できるようにテーブルに配置されます。 そのようなアプリケーションをゼロから設計すると、「1石で2羽の鳥を殺す」ことができます。 一方では、Swift構文の構成を示します。 一方、この単純な実験アプリケーションを、より複雑な適応型Split View ControllerおよびPopover構成のベースとして使用してください

実験応用


ユニバーサルSwiftアプリケーション用の新しいプロジェクトを開き、AdaptiveSplitViewController1Swiftと呼び、 シングルビューアプリケーションテンプレートを使用します (これは、後で詳しく説明するマスター詳細アプリケーションではなくテンプレートです)。


アプリケーションをゼロから設計します。 したがって、 View Controllerの唯一の画面フラグメントをストーリーボードから削除し、ストーリーボードを完全に空のままにします。 ViewController.swiftファイルも削除します。
ストーリーボードを適応モードに設定します。つまり、 サイズクラス自動レイアウトオプションを有効にします。


オブジェクトパレットから、写真のFlickrリスト用のストーリーボードTable View Controllerと、写真のフルサイズ画像用の通常のView Controllerにドラッグアンドドロップします。 最後の画面フラグメントは写真のURLをモデルとして受け取り、その画像を表示します。 したがって、それはImage View Controllerと呼ばれます
Table View ControllerNavigation Controllerに貼り付けます


そして、 Table View ControllerImage View Controllerを、 「Show Photo」という識別子を持つ通常のShowセグエに接続します


Navigation Controllerを開始画面フラグメントとして設定します。


Table View Controllerで、ダイナミックセルのプロトタイプスタイルをSubtitleとして設定し、再利用されたセルのphotoCell識別子を設定しphotoCell


写真を含むテーブルに対して、 UITableViewControllerを継承し、 Photo構造の配列で表される写真のリストを表示するタスクを行う非常に単純なクラスFlickrPhotosTVCを作成します。

FlickrPhotosTVC.swift


DataModel.swiftファイルに配置するPhoto構造には、写真のtitlesubtitle写真に関する詳細情報、一意の写真識別子unique 、写真photographerの写真photographer写真を撮ったimageURL画像のURLがimageURLます。

DataModel.swift


struct Photo構造にはconvenience初期化子init?(json:[String:AnyObject])があり、 Flickrサーバーから受信したJSON入力データが辞書[String:AnyObject]ます。 これはOptional初期化子であり、それが記号を持っている理由? init?という名前の質問init?

DataModel.swift

Photo属性の生成には特別な要件があります。 写真にタイトルがない場合は、写真のsubtitle詳細な説明をtitleとして使用する必要があります。 写真にtitleまたはsubtitle詳細な説明がない場合は、 titleとして「不明」を使用します。 Flickr写真辞書のキーFLICKR_PHOTO_TITLE, FLICKR_PHOTO_ID, FLICKR_PHOTO_DESCRIPTION 、およびFLICKR_PHOTO_OWNERは、FlickrのパブリックAPIを含むFlickrFetcher.hファイルで定義されてます(詳細は後述)。

構造の配列var photos = [Photo]は、 MVC FlickrPhotosTVC Mモデルであり、 UITableViewDataSourceメソッドで使用されます。

FlickrPhotosTVC.swift


また、それを提供するカスタムImageViewControllerクラスのMプロパティがvar imageURL: NSURL?であるという仮定の下でImage View Controllerに「移動」する場合 写真の画像URLを設定しますImage View Controllerの前にNavigation Controllerが存在することを考慮し、 NavigationパネルにdisplayModeButtonItemボタンを追加するように、 FlickrPhotosTVCクラスのコードに新しいショー詳細タイプのセグエを準備しています(詳細は後ほど)。

FlickrPhotosTVC.swift

ストーリーボードの定数は、ストーリーボードのprivater構造に収集されます。

FlickrPhotosTVC.swift


オブジェクト指向プログラミングの概念に従って、 FlickrPhotosTVCクラスをより一般的なものにします。つまり、 [Photo]配列で表される写真の表を形成し、表の特定の行を選択すると、 MVC ImageViewControllerを使用して対応する写真の画像を表示しImageViewController 。 しかし、 FlickrサーバーまたはNSUserDefaultsリポジトリから[Photo]配列を取得する方法については気にしません。
したがって、 Flickr.comサーバーから写真を表示するには、FlickrPhotosTVCクラスのサブクラスである新しいクラスJustPostedFlickrPhotosTVCを作成します。

JustPostedFlickrPhotosTVC.swift

............................

Flickrサーバーからのデータは、 FlickrパブリックAPIを使用してJustPostedFlickrPhotosTVCクラスに読み込まれます。これは、 スタンフォードサイトからFlickr Fetcherフォルダーとして提供されました。 FlickrへのさまざまなリクエストのURLを取得できます。そのコードはObjective-Cで記述されています。 SwiftプロジェクトにObjective-Cコードを含める最も簡単な方法は、 Flickr Fetcherフォルダーから3つのファイルのみをSwiftプロジェクトにコピーし、 FlickrFetcher.mファイルをコピーする前にObjective-Cを追加するかどうか尋ねられます。 Swiftと通信するためのCヘッダーファイル?:



「ヘッダーバインダーファイルを作成する」と答えます。 その結果、空のAdaptiveSplitViewController1Swift-Bridging-Header.hヘッダーファイルがプロジェクト用に生成され、そこにFlickrに必要なパブリックAPIヘッダーファイルを追加します


それだけです 他に何もする必要はありません。FlickrのパブリックAPIクラスと定数に直接アクセスできるようになりました。 Flickr APIキーを取得するだけです。 無料のFlickr.comアカウントは、 Flickr写真投稿せず、リクエストのみを行うため、非常に適しています。
新しく受信したヘッダーファイルは、プロジェクト設定に自動的に書き込まれます。


JustPostedFlickrPhotosTVCクラスに戻りましょう。 JustPostedFlickrPhotosTVCクラスは、 Flickrから最も「新鮮な」写真を読み取るように特別に設計されており、 パブリックAPIを使用して「最近の」写真のリクエストURLを生成します 。 このURLでのデータ読み取りは非同期で行われ、受信した情報は配列に変換されます[Photo]

JustPostedFlickrPhotosTVC.swift


JSONデータの[Photo]構造体の配列への変換は、 flatMap関数、コンテキストからの型推論、およびPhotoイニシャflatMapにより、1行で実行されます。
解析の結果として取得されたself.photos配列は、 スーパークラスFlickrPhotosTVCによって「ピックアップ」され、写真の表が表示されます。ただし、ストーリーボードのFlickr PhotosテーブルのカスタムクラスをJustPostedFlickrPhotosTVCとしてJustPostedFlickrPhotosTVCます。



ネットワークからデータがダウンロードされていることをユーザーに示すために、少し時間がかかります。ストーリーボードの更新コントロールで Flickrの写真画面フラグメントを有効にし ます



Flickrサーバーからデータをダウンロードするfunc fetchPhotos ()メソッドの前に、 func fetchPhotos ()ます。つまり、これがActionであることを示します。



Ctrl @IBAction@IBActionドラッグして、 Refresh Control@IBAction func fetchPhotos ()にバインドします。



写真の本格的な画像を取得するには、 ImageViewControllerクラスを使用します。そのモデルはvar imageURL: NSURL?

ImageViewController.swift


このクラスの詳細な設計については、CS193P Winter 2015のレクチャー9-スタンフォード大学CS193P Winter 2015コースのスクロールビューとマルチスレッド化コース「Developing iOS 8 Apps with Swift」で説明されています。
このクラスをストーリーボードの残りのImage View Controllerに設定します



アプリケーションを起動し、ダウンロードがFlickrで終了するのを待って、写真を選択し、画像を取得します。



すべてが正常に機能し、 コンパクト幅のデバイス(すべてのiPhone、iPhone 6+およびiPhone 6s +を除く、このモードはポートレートモードでのみ有効)、 レギュラー幅のデバイス(すべてのiPadおよびiPhone 6+およびiPhone 6s +横向きモードで) Split View Controllerを使用する必要があります
コードはGithub - AdaptiveSplitViewController1Swiftアプリケーションにあります。
これにより、実験アプリケーションの構成が完了し、クラシックバージョンでの適応型Split View Controllerの実装が続行されます。

1.適応型Split View Controllerのクラシックバージョン


これを行うには、メニューの[ファイル ]-> [ 新規] -> [ファイル] -> [ユーザーインターフェイス ]を使用して、このアプリケーションに別のストーリーボードを作成します。



iPad.storyboardを条件付きで呼び出します(実際、iPad.storyboardの名前をMain.storyboardに変更するため、名前は重要ではありません)。


その結果、空のiPad.storyboardが取得されます。 アプリケーションをiPad.storyboardで動作させるには、コードをAppDelegate.swiftに追加します。


オブジェクトパレットからそれを引き出し 2つの付随するView Controllerとともに表示されるストーリーボードSplit View Controllerに配置します。これはすぐに削除され、 Masterの代わりにMain.storyboard Flickr Photosからコピーされ、 Navigation Controllerに挿入され、 Detail - Image View Controller代わりにNavigation Controllerにも挿入されます


「Show Photo」という識別子を持つ「Show Detail 」タイプの新しい適応型セグエを使用します。



属性インスペクターの図の括弧内で、 詳細表示タイプのセグエ置換 セグエであることが明確になります。これは、このSplit View Controllerの 詳細が新しいMVCインスタンスに置換されることを意味します。 これは、さらなる理解のために非常に重要です。 他のセグエのように、特にdestination (このセグエのために移動するView Controller )がUINavigationController場合、 詳細表示タイプのセグエを準備する必要がありUINavigationController

FlickrPhotosTVC.swift


segueを使用する場合、 Detailは完全に新しいMVCに置き換えられ、 ImageViewControllerロードされる前でもprepareForSegue機能し、一部のアウトレットがまだ設定されていないため、新しいModel値(つまりimageURL )を設定してもImage View Controllerユーザーインターフェイスが完全に更新されない場合があるそして、私たちはまだ画面上に完全にはいません。 したがって、 ImageViewControllerクラスは、Model- imageURLインストールするときに、 Flickrサーバーからの画像データの選択とユーザーインターフェイスの更新がImageViewController既に画面上にある場合にのみ行われるように設計されています。

ImageViewController.swift


この場合、 DetailMVCの新しいインスタンスに完全に置き換えられると、ネットワークからデータを選択し、 viewWillAppear 「ライフサイクル」 viewWillAppear 、つまり画像が画面に表示される直前にUIを更新します。

ImageViewController.swift



iPhone 6以降およびiPadでポートレートモードでアプリケーションを起動します。



iPhone 6+およびiPad 2に空白の画面が表示されます-これはSplitViewController詳細 (この場合はImageViewController )であり、これはiPad専用に設計された以前のSplitViewControllerの通常の動作でした。 しかし、iPhone 6+にマスターへの戻るボタンがある場合(この場合、これはFlickrの写真のリストを含むテーブルです)、iPadでは何をすべきかさえわかりません。 ユーザーは何らかの方法でswipeジェスチャーが機能していることを魔法のように推測する必要があります。 マスターはこれをFlickrの写真のリストとして表示します。
その後、写真を選択すると、写真画面が自動的に更新されます。 すべてが機能しますが、 マスターには戻るボタンがありません。
iPadでポートレートモードでアプリケーションを起動します。


iPadで横長モードでアプリケーションを起動します。

すべてが機能します。

iPhone 6以降でポートレートモードでアプリケーションを起動する


ポートレートモードで起動すると、Flickrの写真を選択するよう促すリターンボタンがあります。 このボタンをクリックして、実際にMasterに入ります。つまり、写真のリストを含む画面の断片です。 その後、写真を選択してその画像を取得できます。 このモードは機能します。

iPhone 6以降で横長モードに切り替える


すべてが機能します。 写真が詳細に更新されます。

これらの実験からどのような結論を導き出すことができますか?

通常の幅のデバイス(iPadをポートレートモードとランドスケープモード、iPhone 6 +、iPhone 6s +ランドスケープモード)を扱う場合、 マスターディテールの両方が同時に画面に表示されます。 適応型Split View Controllerのこのモードはexpandedと呼ばexpandedます。これは、通常のSplit View Controllerの使い慣れたモードですコンパクト幅のデバイス(iPhone 6 +、iPhone 6s +のポートレートモード、他のすべてのiPhoneのポートレートモードとランドスケープモード)
を扱っている場合、画面にはMVCが1つだけありますMasterまたはDetail、したがってこのモードは適応型と呼ばますSplit View Controller。これは、Adaptive Split View ControllerNavigation Controllerとして機能するときのモードです。NavigationControllerのスタックには、マスターディテールの両方がありますcollapsed
両方のプラットフォーム(iPhoneとiPad)で動作し、自動的に適応するストーリーボードが1つあります。

しかし、次の2つのことに満足していません。

ポートレートモードで任意のアプリにして起動するには、のナビゲーションバーに明確にそれを置くためにボタンを戻す必要が見えるAppDelegate.swift


メソッドでprepareForSegueクラスFlickrPhotos

FlickrPhotos.swiftの


見出しに加えて、ナビゲーションコントローラをするためにマスターマスターに、我々の場合になります「Flickr写真」:


その結果、ポートレートモードのiPadに必要な戻るボタンと、ランドスケープモードのiPhone 6 +、iPhone 6s +のモードボタンがあります。


ここではiPhone 6+、iPhone 6S +ランドスケープモードでどのようにモードボタンです:


今すぐ適応作業スプリットビューコントローラ通常の幅のデバイスは満足できるものと見なすことができます。コンパクト幅デバイス用の

適応型Split View Controllerの仕事で私たちに合わないものは何ですか?iPhoneの場合、作業はすぐにマスターが表示された状態で開始し、その後Navigation Controllerのスタックメカニズムを使用して詳細に向かって順次移動する必要があります。これはデリゲートのメソッドによって保証されています。そのうちの1つは現在実装されています。まず、プロトコルを確認しますAppDelegate.swiftそして最後に、デリゲートメソッドを実装します。
UISplitViewControllerDelegateAppDelegate
UISplitViewControllerDelegate




collapseSecondaryViewController, ontoPrimaryViewControllerUISplitViewControllerDelegatecollapsed1つのView Controllerのみが画面に残る場合のモード。彼は、詳細を削除する必要があるかどうかを尋ねます。私たちが答えるとtrue、画面collapsedモードのみ残るマスターマスターにあれば、falseそれから- ディテール。私たちは持っていたいマスターをする場合にのみ、でスタート、時の詳細この- ナビゲーションコントローラ、その題字ビューコントローラスタックではありImageViewControllerM Odel imageURLには値があるnilをtrueを返す前に強調表示するのはこの条件です

AppDelegate.swift


私たちは、開始ポートレートモードでiPhone 6+を


今、私たちの適応インタフェースは、それが必要として動作し、ために、であるコンパクトな幅のデバイス、我々はFlickrの写真のリストを開始します。
これで、古典的な場合の適応型Split View Controllerのセットアップが完了しました。

iPhone.storyboardでストーリーボードMain.storyboardの名前を変更し、このアプリケーションでは、とiPad.storyboard Main.storyboardで歴史にそれを残し、それユニバーサルアプリケーションの基盤作り:



だけでなく、余分なコードを取り除くようAppDelegate



簡単なアプリケーションの最終版AdaptiveSplitViewController1SwiftがオンになっていますGithub

アダプティブSplit View Controllerを作成する手順を要約するには、次の手順を実行します

手順1. オブジェクトパレットからSplit View Controllerをドラッグアンドドロップします
ステップ2. マスター詳細Navigation Controllerに挿入し、Split View Controllerに接続します
ステップの追加3. セグエタイプの表示詳細
のための設定手順4. セグエ方法prepareForSegueという事実与えられたdestinationViewControllerこのセグエは、両方のことができImageViewController、かつUINavigationController最上部にあるスタック内を、ImageViewController
ステップ5. セグエおよびcのprepareForSegue準備メソッドのナビゲーションバーにボタンを追加しますステップ6. デリゲートメソッドを実装します。このメソッドは1つのView Controllerのみが画面に残る必要があるモードに切り替えるときにトリガーされます。この場合、起動時に詳細を削除します。すでに詳細表示segueNavigation Controller、および必要なすべてのコードを備えた優れたマスター/詳細アプリケーションテンプレートを使用すると、これらの6つの手順を行わずにまったく同じコードとUIをすぐに取得できます。作業をもう少し改善できます。AppDelegate
AppDelegatecollapseSecondaryViewController:ontoPrimaryViewController:UISplitViewControllerDelegatecollapsed



iPad用Split View Controller、優先表示モードの設定.AllVisible

AppDelegate.swift


意味preferredDisplayMode?このプロパティは優先表示モードを決定します。Split View Controllerは可能な限りすべてを実行してインターフェイスを構成しますが、たとえば、優先モードで表示するのに十分なスペースがない場合は、別の表示モードを使用できます。デフォルトでは、プロパティの値preferredDisplayMode.Automaticです。 iPadでは、これにより.PrimaryOverlay、縦向きと.AllVisible横向きのモード使用されます。優先表示モードを設定することにより.AllVisible、実際には、ポートレートモードのiPad上のSplit View Controllerの表示のみに影響します。



AppDelegate.swiftコードの2行以上与えコメントアウトあなたはこれらの行からコメントを削除した場合、あなたがのために列幅を調整することができ、マスターディテールを0.0から1.0の値を取るプロパティ使用して、Masterが取る合計画面幅の一部を表すことができます。デフォルトでは、このプロパティはSplit View Controllerによって選択された適切なマスター幅になる取りますマスターの実際の幅は、範囲との値に制限されますSplit View Controller

// splitViewController.preferredPrimaryColumnWidthFraction = 0.5
// splitViewController.maximumPrimaryColumnWidth = 512


preferredPrimaryColumnWidthFractionUISplitViewControllerAutomaticDimension
minimumPrimaryColumnWidthmaximumPrimaryColumnWidth設定可能なプロパティ値に従ってインターフェースを設定するために可能なすべてを行いますが、利用可能なスペースに応じて他のものに変更することができます。プロパティを使用してマスターの実際の幅を取得できますprimaryColumnWidth



コードはGithub - AdaptiveSplitViewController1Swiftアプリケーションにあります

2.マスターの多くのTable View Controller


しかし、Flickrの写真を撮影した写真家向けに、Table View Controllerの画面上の別の断片を追加してみましょう
これを行うには、以前のAdaptiveSplitViewController1Swiftアプリケーションに基づいて、新しいAdaptiveSplitViewController2Swiftアプリケーション作成し、マスター別のTable View Controllerを含めます。 :今私達のユーザーインターフェイスは、次の通りである



。まず、私たちは写真家、彼の写真の一覧から、この写真の後、任意の写真を選択し、選択した写真を表示する:



画面のフラグメント表ビューコントローラカメラマンのためには、かなり単純なクラスを提供していますFlickrPhotographersTVC。それは、クラスのほとんどコピーであるFlickrPhotoTVプロパティもあり、var photos = [Photo]()写真のリストがあるが、その設置その他の財産の計算につながるvar photographers = [Photographer]()これらの写真を撮った写真家のリストがあり、そしてMは、クラスのために身を包んだFlickrPhotographersTVC

FlickrPhotographersTVS.swift


写真Photoと撮影者がPhotographer構造を定義し、ファイルにDataModel.swift


モデルに基づいてvar photographers = [Photographer]()実装された方法UITableViewDataSource

FlickrPhotographersTVS.swiftは、


写真のリストをテーブルの上に「移動」を作製したFlickrの写真法で使用prepareForSegueだけでなく、教室でFlickrPhotosdestinationViewController「移動先」をNavigation Controllerに挿入できることを考慮します

FlickrPhotographersTV.swift


写真家を選択したら、この写真家が撮影した写真のみをphotographerモデルに設定します。ストーリーボードの定数は、次の構造に収集されます。FlickrPhotographersTV.swift「クラシックバージョン」と同じように、オブジェクト指向プログラミングの概念によるクラスは、より一般的な性格を持っていると仮定します。彼はFlickrサーバーまたはからの配列の受信方法を気にしませんFlickrサーバーから配列を取得するために、すでにclassがあり、これを実行しますdestinationViewControllerphotos
privateStoryboard




FlickrPhotographersTVC[Photo]NSUserDefaults[Photo]JustPostedFlickrPhotosTVCサブクラスではありませんFlickrPhotosTVC「古典的な」バージョン「としてサブクラス FlickrPhotographersTVC

JustPostedFlickrPhotosTVS.swift


このクラスは、JustPostedFlickrPhotosTVC画面領域のカスタムクラスであるFlickrの写真家


画面のフラグメントFlickrの写真ますユーザークラスFlickrPhotosTVC


それはどのように動作するかのアプリを起動し、表情。 iPhone 6+(またはiPhone 6s +)がポートレートモードからランドスケープモードに移行する場合(つまり、Adaptive Split View Controllerの用語によるとcollapsedモードc から移行する場合)を除き、すべてが正常に機能します。同時に、ポートレートモードの画面には、所定の位置にある写真のリストが表示されます。expanded選択した写真の画像ではなく、詳細画面View Controllerが1つしかないモード



からcollapsedモードに切り替えた場合画面上で同時にマスター詳細)、適応分割View Controllerデフォルトで現在の画面を詳細として使用します。そして、これは私たちが必要とするものではありません:Detailの代わりにあるのはのみです。別のデリゲートメソッドを使用して、必要な設定を行う必要があります。AppDelegate.swiftこのメソッドはモードからモードに切り替えるときに機能しexpandedImageViewControllerseparateSecondaryViewControllerFromPrimaryViewControllerUISplitViewControllerDelegate




separateSecondaryViewControllerFromPrimaryViewControllercollapsedexpandedView ControllerDetailとして取得する必要があります。デフォルトでは、現在のView Controllerマスターでない場合詳細として扱わます。特殊なケースでは、写真のリストがNavigation Controllerに挿入されたテーブルがある場合、情報が乏しい状況で詳細生成する必要があります。ストーリーボードからすぐに(写真の画像)を取得する場所がなく、ストーリーボード上の詳細画面フラグメントの識別子が必要です(この場合、これはDetailのナビゲーションコントローラーです)。この識別子を「detailNavigation」とします。primaryViewControllerFlickrPhotosTVCImageViewController



復元後の詳細ストーリーボードから、私たちは得ることができますImageViewController(コードがあるcontroller)と、必要な調整を行います。ナビゲーションバーのボタンを追加し、ヘッダを置くImageViewControllerと彼のセットアップM(この場合はOdel imageURL写真のリストの最初の行に対応します)、:ファイル名を指定して実行アプリケーション、今ではすべてが正しく動作します。また、最初の行は、写真に示されているため写真リストで強調表示されています:結論:仕事適応することを確実にするために、スプリットビューコントローラソフトウェアテイク C倍数(> 1)を表ビューには、コントローラを取るマスターマスターに、あなたは、メソッドを使用する必要があるデリゲートを

if let photo = photosView.photos.first {
controller.imageURL = NSURL(string: photo.imageURL)
controller.title = photo.title
}





separateSecondaryViewControllerFromPrimaryViewControllerUISplitViewControllerDelegate
コードは、GithubAdaptiveSplitViewController2Swiftアプリケーション)にあります第二部このチュートリアルで、我々はさらに我々の実験アプリケーションが複雑になりますし、ケース3に拡張- タブバーコントローラソフトウェアとしてマスターのためのスプリットビューコントローラソフトウェアを取る適応- 、および5 ポップオーバーすべてのオプションのコードはGithubにあります。


Source: https://habr.com/ru/post/J278573/


All Articles