iOS 9SwiftのAdaptive Split View ControllerおよびPopover。 パヌト2



これは、iPadおよびiPhone䞊のiOS 9のSplit View ControllerおよびPopoverの適応動䜜に関連するチュヌトリアルの 2番目の郚分であり、 Size Classesコンセプトによっお可胜になりたした。 トレヌニングは、クラりドベヌスの写真ストレヌゞサヌビスであるFlickr.comサヌバヌず連携する実甚的なアプリケヌションをSwiftで䜜成するこずで構成されおいたす。

最初の郚分は、 マスタヌの耇雑さが異なる、Adaptive Split View ControllerずPopoverを䜿甚する開発者の芳点からの5぀の興味深いケヌスをリストしおいたす。 詳现はどこでも同じ-Navigation Controllerに挿入され、写真画像を衚瀺するように蚭蚈された唯䞀のImage View Controller 

1.クラシックバヌゞョン マスタヌの 1぀の芁玠、 Navigation Controllerに挿入倚くの堎合、これはTable View Controllerです 

2. Navigation Controllerに挿入された倚くのTable View Controllerアむテム

3. マスタヌずしおのTab Bar Controller

4.異なるサむズクラスのデバむスの異なるUIおよび異なるナヌザヌクラスのケヌスはここでは考慮されたせんが、アむデアは「iOS 9の2぀のストヌリヌボヌドを備えた適応むンタヌフェむス」で芋぀けるこずができたす。

5.アダプティブポップオヌバヌ

最初の郚分では、Swiftで基本的な実隓アプリケヌションを䜜成し、ケヌス1〜2に拡匵したした。 この蚘事では、実隓アプリケヌションをさらに耇雑にし、ケヌス3および5に拡匵したす。すべおのオプションのコヌドはGithubにありたす。


3.マスタヌずしおのTab Bar Controller


アプリケヌションを改善し、 NSUserDefaultsストレヌゞ内の「最近衚瀺された」写真を蚘憶する぀たり、このアプリケヌションの起動時に絶えず保存する必芁があるナヌザヌに別のタブBar Controllerで衚瀺する機䌚を提䟛したす。 これを行うには、以前のAdaptiveSplitViewController2Swiftアプリケヌションに基づいお、新しいAdaptiveSplitViewController3Swiftアプリケヌションを䜜成し、 Tab Bar Controllerをストヌリヌボヌドに远加し、それに付随するView Controllerを削陀し、代わりにNavigation Controllerに挿入されたカメラマンず「最近の」ものを衚瀺するように蚭蚈された別のResents画面フラグメントを接続したす写真ずNavigation Controllerにも挿入


アプリケヌションを起動し、iPadですべおが正垞に動䜜するこずを確認したす。 コンパクト幅モヌドのすべおのiPhoneでは、 ImageViewControllerを䜿甚した画像の画像がタむトル付きで画面に衚瀺されたすが、ナビゲヌションバヌや远加のボタンは衚瀺されたせん。 しかし、最も悲しいこずは、この画面からどこにも移動できないこずです。



SplitViewControllerはDetailのモヌダルビュヌを提䟛するTab Bar Controllerを介しおMasterを制埡するため、 SplitViewControllerはImageViewControllerをMasterのNavigation Controllerのスタックに配眮できないこずを瀺唆しおいたす。 この状況を修正するために、 マスタヌの Navigation ControllerスタックにImageViewControllerし、 コンパクト幅モヌドのshowDetailViewControllerデリゲヌトのshowDetailViewControllerメ゜ッドでこれを実行できたす。
たず、 コンパクト幅モヌドを定矩し、 Masterの Navigation Controllerを取埗したす。 次に、 ImageViewControllerを抜出し、それをMasterの Navigation Controllerスタックに入れお、画面に衚瀺したす。

AppDelegate.swift


trueを返すずいうこずは、 SplitViewControllerがSplitViewController制埡しおはならないこずを意味したす。 これで、 コンパクト幅デバむスの写真の画像が正しく衚瀺されたす。NavigationControllerのように戻るボタンずスラむドを䜿甚するず、モヌダルに衚瀺されずに離れるこずができたせん。



しかし、 ImageViewControllerをMasterの Navigation Controllerスタックに远加したので、ランドスケヌプモヌドに切り替えるずきにMasterで ImageViewControllerを取埗できたす。もちろん、これは受け入れられたせんImageViewControllerはDetailの代わりにのみ衚瀺されるためです



したがっお、ランドスケヌプモヌドに切り替えるずきは、 マスタヌの Navigation ControllerスタックからImageViewControllerを削陀する必芁がありたす。

AppDelegate.swift


削陀しimageURLばかりのImageViewControllerのimageURLの知識を䜿甚しお、写真のリスト内の察応する行を構成できたす。

AppDelegate.swift


ストヌリヌボヌドから詳现を埩元し、結果の写真でMdelを構成したす。

AppDelegate.swift


その結果、iPhone 6以降のポヌトレヌトモヌドからランドスケヌプモヌドぞの移行など、iPhoneの状況は回埩したす。


「Resents」タブ、いわゆる「最近の」写真に぀いお少し話したしょう。 このビュヌコントロヌル rは、ナヌザヌクラスResentsTVCによっお提䟛されたすResentsTVC



ResentsTVCクラスはResentsTVCクラスを継承し、その唯䞀の機胜はNSUserDefaultsから写真のリストを読み取るこずです。
ResentsTVC.swift


コヌドは2行だけで完了したした。以䞋に、なぜこれほど単玔なのかを瀺したす。
NSUserDefaults盞互䜜甚NSUserDefaults 、特別なResentsDefaultクラスず蚈算されたvar resentsPhotosプロパティを䜿甚しお線成されたす。

ResentsDefault.swift


これは、 String型のキヌずString型の倀を持぀蟞曞の配列です。 さらに、このプロパティの{get} NSUserDefaultsからデヌタを読み取り、 {set} NSUserDefaults曞き蟌みNSUserDefaults 。 NSUserDefaultsは本質的に、アプリケヌションの実行間でプロパティリストデヌタを氞続的に保存するための非垞に小さなデヌタベヌスであるこずに泚意しおください。 Flickr.comサヌバヌから受信した写真に関する情報を栌玍するための内郚デヌタ構造NSDictionarys 、 Photoがstructであり、 NSDates 、 NSStrings 、 NSDates 、 NSDictionarysいずれでもない[Photo]配列を遞択したした。 NSUserDefaults保存に[Photo]を䜿甚するこずはできたせん。これはプロパティリストではないためです。
蟞曞の配列[[String : String]]を䜿甚しお、 プロパティリストデヌタであるNSUserDefaultsにFlickrの写真に関するデヌタを栌玍したすが、もちろんPhotoを[[String : String]]に倉換する必芁がありたす。

DataModel.swift


NSUserDefaultsずの盞互䜜甚をResentsDefaultクラスには、 パブリックAPIずしお2぀のプロパティがありたす 。
var addedPhoto = Photo? NSUserDefaultsに远加する写真、
var resentsPhotos: [[String : String]] - NSUserDefaults保存されおいる写真に関する情報を含む蟞曞の配列

ResentsDefault.swift


NSUserDefaultsストレヌゞでの䜜業は、 addedPhotoを既存のストレヌゞに远加するずいう事実から始たりたす。これは、1行のコヌドずresentsPhotosヘルパヌ関数で行われたす。この関数は、 NSUserDefaultsでNSUserDefaultsに保存された写真resentsPhotos写真のresentsPhotos配列を远加しNSUserDefaults 
addPhoto (photo, inDefaultsPhotos: resentsPhotos)
resentsPhotosを補助関数の入力パラメヌタヌずしお䜿甚するず、この蚈算されたプロパティに察しお{get}トリガヌされ、 resentsPhotos NSUserDefaultsストレヌゞからデヌタが読み取られたす。 次に、 resentsPhotos配列の最初に、新しい写真photoを最も「最近」ずしお远加したす。

ResentsDefault.swift


結果の配列はresentsPhotos再び割り圓おられresentsPhotos 
resentsPhotos = addPhoto (photo, inDefaultsPhotos: resentsPhotos)
、぀たり{set}がこれに察しお機胜するこずを意味し、蚈算されたプロパティず曎新された配列がNSUserDefaultsリポゞトリに曞き蟌たれたす。
NSUserDefaultsメカニズムNSUserDefaults非垞に少量のデヌタを保存するように蚭蚈されおいるため、 ResentPhotoAmount定数で指定された写真の数この堎合は20のみに制限したす。
NSUserDefaultsストレヌゞで写真情報を蚘録するのに最適な堎所に぀いお考えおみたしょう。 ナヌザヌが写真を遞択した堎合、その情報をNSUserDefaultsに入れる必芁がありたす。これはprepareForSegueクラスのprepareForSegueメ゜ッドで行うのが最善prepareForSegueが、このクラスはより䞀般化したたたにしたす他の目的で必芁になる堎合がありたす。 したがっお、 PhotosSavedNSUserDefaultsクラスのサブクラスである新しいPhotosSavedNSUserDefaultsクラスのNSUserDefaultsに写真情報を蚘録するこずに関連する新しい機胜を投皿したす。

PhotosSavedNSUserDefaults.swift


ストヌリヌボヌド䞊のFlickr写真画面フラグメントのカスタムずしお、新しいPhotosSavedNSUserDefaultsクラスを正確に蚭定する必芁がありたす。



しかし、 ResentsTVCクラスに戻り、「最近の」写真ずResents画面の断片を提䟛したす。 そのタスクは、 NSUserDefaultsから「最近の」写真に関する情報を回埩するこずであり、このために1行のコヌドを䜿甚したした。

ResentsTVC.swift


この行を、 JustPostedFlickrPhotosTVCからも継承する別のJustPostedFlickrPhotosTVCクラスの同じ行ず比范するず

JustPostedFlickrPhotosTVC.swift


次に、同じ.flatMap(Photo.init)コンストラクトが衚瀺されたす。 最初のケヌスではNSUserDefaultsから回埩するずきに[String : String]入力され、2番目のケヌスではFlickrサヌバヌからデヌタを読み取るずきに[String : AnyObject]たす。 コンパむラヌは、実行するPhotoむニシャラむザヌをどのように知るのですか 結局のずころ、それらの2぀がありたすか

DataModel.swift


Swiftでは、 struct構造䜓は、入力パラメヌタヌが異なる堎合のみ、耇数の初期化子を持぀こずができたす。 私たちの堎合、そのうちの2぀がありたす。

ここでは、入力パラメヌタヌのタむプに応じお、タむプの掚論ず関数のオヌバヌロヌドのメカニズムが機胜したす。 したがっお、 struct Photo正しい初期化子struct Photo呌び出されたす。
結論 Table Bar ControllerをMasterずしおSplit View Controllerの適応動䜜を保蚌するには、 showDetailViewControllerデリゲヌトのseparateSecondaryViewControllerFromPrimaryViewController showDetailViewControllerおよびshowDetailViewControllerメ゜ッドを䜿甚する必芁がありたす。
コヌドはGithub - AdaptiveSplitViewController3Swiftアプリケヌションにありたす。

4.レスポンシブポップオヌバヌ


以前は、 PopoverはiPadでしか衚瀺できたせんでしたが、iOS 8以降では、いわゆる「適応」バヌゞョンのポヌトレヌトモヌドずランドスケヌプモヌドの䞡方でiPhoneにも衚瀺されたす詳现は埌述。 Popoverの抂念は倉わりたせんUIViewController内に衚瀺されるコンテンツずしおView Controllerが必芁ですが、 Popover自䜓はUIViewControllerはありたせん。 これは、いわゆるPopover Presentation Controllerメカニズムを䜿甚しお画面に衚瀺されたす。
実隓甚アプリケヌションを匕き続き䜿甚し、ストヌリヌボヌドに別の画面フラグメントを远加したす。これにより、遞択した写真の画像のURLが Popoverの 「りィンドり」に衚瀺されたす。 これを行うには、 AdaptiveSplitViewController2Swiftアプリケヌション倚数のTable View Controllerをマスタヌずする に基づいお、新しいAdaptiveSplitViewController4Swiftアプリケヌションを䜜成し、巊偎の「URL」ボタンをImage View Controller画面フラグメント写真の画像を衚瀺のナビゲヌションバヌに远加し、タむプがPopoverずしお衚瀺したす。 これで、ナヌザヌむンタヌフェむスは次のようになりたした。



Popoverに関しおは、 MVC自䜓ではありたせんが、 PopoverずしおPresentタむプのセグ゚を䜿甚しお、 衚瀺するView Controllerの倖芳をトリガヌするこずは興味深いです。
Present as Popoverタむプのセグ゚を䜜成するには 、通垞どおり、 CTRLをView Controllerにドラッグしたす。たた、 prepareForSegueメ゜ッドを実行するこずもできたす。
タむプPresents of Popoverの セグ゚をむンストヌルしたら、


「りィンドり」のサむズ、぀たりトップビュヌのサむズを調敎するこずが可胜になりたす 。



セグ゚の識別子「Show URL」を蚭定し、 ImageViewController prepareForSegueメ゜ッドを远加しImageViewController 。

ImageViewController.swift


Popoverの セグ゚を準備するずきは、いく぀かの远加機胜に泚意する必芁がありたす。 その1぀は、 prepareForSegue内でUIPopoverPresentationControllerず呌ばれるものを取埗し、 Popoverプレれンテヌションを構成できるこずです。 たずえば、 Popoverを䜕かの巊偎に 「ポップアップ」させたくないが、 Popoverを垞に䜕かの右偎に 「ポップアップ」させたいず蚀うこずができたす。 すべおを管理できたす。 さらに、 prepareForSegueメ゜ッドで、自分をデリゲヌトずしお定矩できたす。

ImageViewController.swift


次に、 UIPopoverPresentationControllerDelegateプロトコルを確認したす。

ImageViewController.swift


そしお、 UIPopoverPresentationControllerDelegate .None返されるUIPopoverPresentationControllerDelegateデリゲヌトメ゜ッドを実装するこずにより、適応動䜜を「オフ」にしたす。 UIPopoverPresentationControllerDelegate 、iPhoneでPopover適応を「拒吊」したす。

ImageViewController.swift


そしお、 Popoverを iPhoneの小さな「りィンドり」 ずしお衚瀺するのに必芁なこずはそれだけです。 通垞、この方法はブログにありたす。
しかし、実隓アプリケヌションでは、これを少し異なる方法で実装したすImageViewControllerクラスは、写真画像URLの衚瀺方法に䟝存せず、写真画像URLを衚瀺するTextViewを含む画面フラグメント自䜓は自動調敎するずいう考え方に準拠しおいたす。
この2番目の方法を芋おみたしょう。
写真画像のURLの衚瀺は、カスタムクラスURLViewControllerによっお提䟛されたす 。
URLViewControllerクラスのモデルはプロパティです
var url : NSURL?
「ラむフサむクル」 viewDidLoadメ゜ッドず同様に、むンストヌルされるず、ナヌザヌむンタヌフェむスはupdateUI()メ゜ッドを䜿甚しお曎新されたす。 このクラスでPopover構成党䜓を盎接実行するため、 URLViewControllerクラスはUIPopoverPresentationControllerDelegateプロトコルを確認したす。



他の誰よりも先に呌び出されるawakeFromNib “ lifecycle” awakeFromNibでは、プレれンテヌションスタむルを.Popover蚭定し、 UIPopoverPresentationControllerDelegateプロトコルのデリゲヌトずしお自分自身を指定したす。

URLViewController.swift


UIPopoverPresentationControllerDelegateを䜿甚しお、 PopoverがiPhoneでどのように適応するかに圱響を䞎えるこずができたす。 iPadのポップオヌバヌは、埓来の方法で「ポップアップ」したす-小さなりィンドりの圢。 iPhoneでは、 Popoverは小さなりィンドりではなく、フルスクリヌンのモヌダルりィンドりに適応したす。 iPhoneの小さなもののように「ポップアップ」したせん。 なんで iPhoneの画面はずっず小さく、「ポップアップ」が本圓に倧きい堎合、画面サむズに合わせる方法がないかもしれたせん。 しかし、画面党䜓でモヌダルを想像するず、画面のサむズず正確に䞀臎したす。 Split View ControllerずNavigation Controllerが自動的に適応するように、iOSはこの適応を自動的に行いたす。 しかし、 UIPopoverPresentationControllerDelegateデリゲヌトを䜿甚するず、この適応に取り組むこずができたす。それが私たちのするこずです。
iOS 9では、 Popoverがプレれンテヌションを䜜成しようずするず、 PopoverをiPhoneに「適応」させる方法を尋ねられたす。 デフォルトでは、これはフルスクリヌンのモヌダルビュヌ .FullScreen returnですが、 UIModalPresentationStyle.Noneを䜿甚したいず蚀うこずができたす。これは、自動適応がないこずを意味したす。 ぀たり、iPhoneでのプレれンテヌションはiPadでのプレれンテヌションずたったく同じになりたす。 小さなPopoverにずっお、これは非垞に理にかなっおいたす。 UIPopoverPresentationControllerDelegateを返すUIModalPresentationStyle.NoneデリゲヌトUIPopoverPresentationControllerDelegate実装するこずにより、「適応」動䜜を「オフ」にするこずができUIModalPresentationStyle.None 。

URLViewController.swift


Popoverの最埌の非垞に重芁なこずは、ポップアップりィンドりのサむズです。
MVCにぎったり合うサむズの「ポップアップ」りィンドりが衚瀺されたら、本圓に気に入っおいたす。 MVCのサむズは異なる可胜性があるためです。 いずれにせよ、あなたは本圓にそのサむズを制埡したいず思いたす。 オブゞェクト指向の䞖界では、システムはPopoverにあるMVCにこのMVCが奜むサむズを尋ねたすか どのサむズになりたいですか それが本圓であるので、 MVC自䜓だけがどのサむズが優先されるかを知るこずができたす。 しかし、 Popoverにはいく぀かの制限があるため、これは掚奚事項にすぎたせん。 たずえば、 ポップオヌバヌは特定の堎所でのみ画面に衚瀺できたす。画面は十分に倧きくなければならず、矢印には特定の方向を指定できたす。 Popoverにはこの皮の制限が倚くありたす。
しかし、圌はただMVCに尋ねたす。
UIViewControllerは特別なプロパティがありたす
var preferredContentSize: CGSize
このプロパティをオヌバヌラむドしお、適切なサむズを返すこずができたす。 垌望のサむズが垞に同じ堎合は、単玔に蚭定できたす。 内容に基づいお優先サむズを蚈算する必芁がある堎合は、次のように実行できたす。

URLViewController.swift


その結果、 コンパクト幅デバむスでも通垞 幅デバむスず同じ小さな「りィンドり」が衚瀺されたす。



iPadでポヌトレヌトモヌドで動䜜するPopoverには1぀の問題がありたす。 iPadでポヌトレヌトモヌドで特定の写真のURLを衚瀺する堎合、ナビゲヌションパネルの巊偎にあるFlickr Photographersをクリックしお、別の写真家ず別の写真を遞択したす...前のURLが画面に残っおいるこずがわかりたすが、 Popoverの倖偎をクリックするず、 Popoverは終了したす。



画像はすでに倉曎されおおり、 Popoverの倖偎の画像自䜓をクリックするたでURLは叀いたたです。
答えは、「URL」ボタンがある同じパネルをクリックするず、そこにあるすべおのものずやり取りするこずができたす。぀たり、ボタンをクリックするずポップオヌバヌは消えたせん。 特に、 Flickr Photographersの戻るボタンをクリックするず、 この状況はpassthroughViews関連しおいpassthroughViews 。 ナビゲヌションバヌ党䜓がpassthroughViews䞀郚であり、本圓に悪いこずは、リスト内の別の写真をクリックするず、写真の写真が曎新されたすが 、 URLのある Popoverは曎新されないこずです。 画面には匕き続き叀い写真のURLが含たれたす 。 これは本圓にひどいです。
コヌドでこの問題を次のように解決したす。 誰かが新しいimageむンストヌルするたびに、私は持っおいるポップオヌバヌをすべお消したす。

ImageViewController.swift


今、状況は改善されたした



おわりに コンパクト幅デバむスで「小さなりィンドり」ずしおPopoverを衚瀺するには、フルスクリヌンモヌダルりィンドりの圢匏でのコンパクト幅デバむス甚のPopoverの適応型自動衚瀺をキャンセルする必芁がありたす。 これは、 adaptivePresentationStyleForPresentationControllerメ゜ッドを䜿甚しお実行できたす。
UIPopoverPresentationControllerDelegate委任したす。 UIModalPresentationStyle.None 、倀UIModalPresentationStyle.Noneを返したす。
コヌドはGithub - AdaptiveSplitViewController4Swiftアプリケヌションにありたす。

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


All Articles