太古の昔から、iOSのSplit View ControllerとPopoverはiPadでのみ利用可能でした。
iOS 8以降では、 サイズクラスの概念とその適応動作により、iPadとiPhoneの両方で動作するようになりました。 ただし、Appleが提案する「すぐに使用できる」自動適応はほとんどの場合私たちに
UISplitViewControllerDelegate
ず、デリゲートメソッド
UISplitViewControllerDelegate
および
UIPopoverPresentationControllerDelegate
を使用して少し追加のコードを記述する
UISplitViewControllerDelegate
あり
UIPopoverPresentationControllerDelegate
。 この記事では、クラウドベースの写真ストレージサービスであるFlickr.comサーバーと連携する非常にシンプルで実用的なアプリケーションを使用して、 Split View ControllerとPopoverの適応機能を調べます。 データがサーバーから読み取られ、リンクされたテーブルとイメージの形式で表示される一般的なケースであるため、このタスク自体には大きな実用的な意味があります。 途中で、計算されたプロパティc
{get}
および
{set}
、
didSet{}
プロパティのオブザーバ、
didSet{}
関数
map, flatMap, filter
、コンテキストからの型推論、および関数のオーバーロードなど、Swiftのライブ構文構築を示します。 SwiftとObjective-Cコードの併用、構造
struct
構造の使用、
NSUserDefaults
ストレージの使用など。 それでも、この記事では、Adaptive Split View ControllerとPopoverのより複雑な構成に焦点を当てています。
その結果、この記事のすべてのアプリケーションを、同様のタスクを使用してアプリケーションを開発するためのテンプレートとして使用できます。
そのため、iOSの新しい哲学によれば、画面のサイズクラスに応じて、ユーザーインターフェイス(UI)をあらゆる種類のデバイスにすばやく構成できます。
iOS 8でさまざまなデバイスを分類するために、 サイズクラスの概念が導入されました。 4つのサイズクラスのみ:
- 水平レギュラー
- 横型コンパクト
- 垂直レギュラー
- 縦型コンパクト
View Controller
( Split 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のストーリーボードに非常に似ています。
- すべての画面フラグメントのサイズは同じで、クラスに対応しますw Any h Xcodeのユニバーサル、
- Show Detai lタイプの新しい適応型セグエが登場しました 。これは、 Split View Controllerが2つの機能を同時に実行するのに役立ちます。iPhoneの場合のように、 Navigation Controllerでスタック要素を「スライド」し、Split View Controllerで通常の「 Detail 」に移動しますiPad用。 ( 以前は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 ControllerをNavigation Controllerに貼り付けます
そして、 Table View ControllerとImage View Controllerを、 「Show Photo」という識別子を持つ通常のShowセグエに接続します 。
Navigation Controllerを開始画面フラグメントとして設定します。
Table View Controllerで、ダイナミックセルのプロトタイプスタイルをSubtitleとして設定し、再利用されたセルの
photoCell
識別子を設定し
photoCell
写真を含むテーブルに対して、
UITableViewController
を継承し、
Photo
構造の配列で表される写真のリストを表示するタスクを行う非常に単純なクラス
FlickrPhotosTVC
を作成します。
FlickrPhotosTVC.swift
DataModel.swiftファイルに配置する
Photo
構造には、写真の
title
、
subtitle
写真に関する詳細情報、一意の写真識別子
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
この場合、 DetailがMVCの新しいインスタンスに完全に置き換えられると、ネットワークからデータを選択し、
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 ControllerがNavigation Controllerとして機能するときのモードです。NavigationControllerのスタックには、マスターとディテールの両方があります。
collapsed
両方のプラットフォーム(iPhoneとiPad)で動作し、自動的に適応するストーリーボードが1つあります。
しかし、次の2つのことに満足していません。
- iPadでポートレートモードで起動するとき、iPhoneでポートレートモードで起動するときと同じ戻るボタンが表示されるようにします。
- iPhoneをポートレートモードで起動すると、(iPadの場合のように)空白の画面で詳細が表示されず、マスター(iPhoneの場合のように)が表示されます。
ポートレートモードで任意のアプリにして起動するには、のナビゲーションバーに明確にそれを置くためにボタンを戻す必要が見える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そして最後に、デリゲートメソッドを実装します。
UISplitViewControllerDelegate
AppDelegate
UISplitViewControllerDelegate
collapseSecondaryViewController, ontoPrimaryViewController
UISplitViewControllerDelegate
collapsed
1つのView Controllerのみが画面に残る場合のモード。彼は、詳細を削除する必要があるかどうかを尋ねます。私たちが答えると
true
、画面
collapsed
モードのみ残るマスターマスターにあれば、
false
それから- ディテール。私たちは持っていたいマスターをする場合にのみ、でスタート、時の詳細この- ナビゲーションコントローラ、その題字ビューコントローラスタックではありImageViewController、M 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のみが画面に残る必要があるモードに切り替えるときにトリガーされます。この場合、起動時に詳細を削除します。すでに詳細を表示segue、Navigation Controller、および必要なすべてのコードを備えた優れたマスター/詳細アプリケーションテンプレートを使用すると、これらの6つの手順を行わずにまったく同じコードとUIをすぐに取得できます。作業をもう少し改善できます。
AppDelegate
AppDelegate
collapseSecondaryViewController:ontoPrimaryViewController:
UISplitViewControllerDelegate
collapsed
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
preferredPrimaryColumnWidthFraction
UISplitViewControllerAutomaticDimension
minimumPrimaryColumnWidth
maximumPrimaryColumnWidth
設定可能なプロパティ値に従ってインターフェースを設定するために可能なすべてを行いますが、利用可能なスペースに応じて他のものに変更することができます。プロパティを使用して、マスターの実際の幅を取得できます
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
だけでなく、教室で
FlickrPhotos
destinationViewController
「移動先」をNavigation Controllerに挿入できることを考慮します:
FlickrPhotographersTV.swift
写真家を選択したら、この写真家が撮影した写真のみを
photographer
モデルに設定します。ストーリーボードの定数は、次の構造に収集されます。FlickrPhotographersTV.swift「クラシックバージョン」と同じように、オブジェクト指向プログラミングの概念によるクラスは、より一般的な性格を持っていると仮定します。彼はFlickrサーバーまたはからの配列の受信方法を気にしません。Flickrサーバーから配列を取得するために、すでにclassがあり、これを実行します
destinationViewController
photos
private
Storyboard
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このメソッドは、モードからモードに切り替えるときに機能し、
expanded
ImageViewController
separateSecondaryViewControllerFromPrimaryViewController
UISplitViewControllerDelegate
separateSecondaryViewControllerFromPrimaryViewController
collapsed
expanded
View ControllerはDetailとして取得する必要があります。デフォルトでは、現在のView Controllerがマスターでない場合、詳細として扱われます。特殊なケースでは、写真のリストがNavigation Controllerに挿入されたテーブルがある場合、情報が乏しい状況で詳細を生成する必要があります。ストーリーボードからすぐに(写真の画像)を取得する場所がなく、ストーリーボード上の詳細画面フラグメントの識別子が必要です(この場合、これはDetailのナビゲーションコントローラーです)。この識別子を「detailNavigation」とします。
primaryViewController
FlickrPhotosTVC
ImageViewController
復元後の詳細ストーリーボードから、私たちは得ることができます
ImageViewController
(コードがある
controller
)と、必要な調整を行います。ナビゲーションバーのボタンを追加し、ヘッダを置く
ImageViewController
と彼のセットアップM(この場合はOdel
imageURL
写真のリストの最初の行に対応します)、:ファイル名を指定して実行アプリケーション、今ではすべてが正しく動作します。また、最初の行は、写真に示されているため写真リストで強調表示されています:結論:仕事適応することを確実にするために、スプリットビューコントローラソフトウェアテイク C倍数(> 1)を表ビューには、コントローラを取るとマスターマスターに、あなたは、メソッドを使用する必要があるデリゲートを
if let photo = photosView.photos.first {
controller.imageURL = NSURL(string: photo.imageURL)
controller.title = photo.title
}
separateSecondaryViewControllerFromPrimaryViewController
UISplitViewControllerDelegate
。
コードは、Github(AdaptiveSplitViewController2Swiftアプリケーション)にあります。第二部このチュートリアルで、我々はさらに我々の実験アプリケーションが複雑になりますし、ケース3に拡張- タブバーコントローラソフトウェアとしてマスターのためのスプリットビューコントローラソフトウェアを取る適応- 、および5 ポップオーバー。すべてのオプションのコードはGithubにあります。