UIPresentationController是提供高級視圖切換的類。它讓管理present ViewController的過程變得簡單。app

先講一些presentation基礎知識,在iPad的設置頁面,能夠經過popOver彈出一個UIViewController,這個彈出的,能夠和用戶交互的Controller叫作PresentedViewController,然後面那個被部分遮擋的UIViewController叫作PresentingViewController,而在UIPresentationController中,PresentedViewController是presentation的content,而PresentingViewController叫作Chrome。以下圖:ide

PresentedViewController和PresentingViewController Content



Chrome


全部的UIViewController的presentation都是由UIPresentationController管理的。在UIPresentationController中能夠定義content和chrome的動畫,能夠根據大小的變化來改變content大小,能夠根據系統的不一樣,來改變展現方式,UIPresentationController也是可複用的,能夠很容易的拿到其餘的UIViewController中去使用。post


UIPopoverPresentationController測試

它在iOS8中替代了UIPopoverController,它在功能上與舊的controller徹底等同,而且新增了一些內置的適配特性,能夠自動適配iPad與iPhone。如下是新版與舊版接口的比較:動畫

UIPopoverController使用方法:編碼

咱們先聲明瞭一個UIViewController做爲content controller,使用它初始化了一個UIPopoverController,而後調用presentPopover方法來展現它。這是在iPad上的用法。若是要建立一個在iPad與iPhone上通用的方法,那麼須要如下的代碼:spa

咱們須要去判斷設備是否爲iPad,若爲iPad,那麼建立一個UIPopoverController並展現它,若不是iPad,那麼就須要調用常規的presentViewController方法來展現一個UIViewController。3d

然而咱們若是使用UIPopoverPresentationController,那麼就再也不須要判斷設備:blog

將UIViewController的modalPresentationStyle設置成UIModalPresentationPopover,這個值用來實現popover效果,而且各個平臺自動適應。第二行中,經過popoverPresentationController屬性來獲取它的popoverPresentationController,而不是建立一個新的。而後設置它的一些界面屬性,最後調用presentViewController方法來顯示這個controller。這樣就能夠在iPad與iPhone顯示自動適應的popover效果了,以下圖所示:

iPad效果 iPhone效果

可見,iPhone上,只是做爲一個普通的UITableViewController展現出來。

iPhone上的自適應是在delegate中實現的:

在第一個方法中,指定了UIModelPresentationFullScreen的樣式來展現controller。第二個方法中,咱們將presentedViewController使用UINavigationController包裝起來,使得能夠在選中某項以後,經過navigationController提供的一些方法來展現內容,或者後退。


UIAlertView與UIActionSheet

UIAlertView與UIActionSheet都是繼承自UIView的,可是它們在實現時,卻用了一些UIViewController的方式,而且它的接口比較舊,採用的是delegate方式。在iOS8中,新增了UIAlertController,它能夠同時實現Alert和Action Sheets,而且接口採用block方式,它將在應用的同一個window中展現,而不是以前的新window中展現,它還具備和以前的popover controller相同的實現方式,經過presentViewController來展現。下面是新的UIAlertController的用法:

首先建立一個UIAlertController,以後經過addAction方法來增長一些action,而UIAlertAction使用block來設置按鈕的點擊處理方法。最後,經過調用presentViewController來展現UIAlertController。


UISearchDisplayController

search在iOS中包含兩部分:UISearchBar與UISearchDisplayController。它們都是很古老的接口,功能與樣式都不能知足現狀的應用,UISearchDisplayController的配置項不多,它只能在tableView中顯示結果,而不能在collectionView或者mapView中顯示。它的present過程只是經過addSubview來將view做爲一個子view添加上去。而若是它的父view是一個scrollView,那麼手勢處理就會有衝突。在iOS8中,引入了UISearchController,它容許presentingController是任意類型的,不必定是全屏幕的,search bar animation能夠自定義,而且能夠在不一樣平臺上適配。

在以前的接口中,咱們使用UISearchDisplayController來實現search功能:

首先初始化一個UISearchBar,再用它初始化一個UISearchDisplayController,指定controller的searchResuleDataSource與searchResultDelegate,以後,將searchBar做爲當前view中的tableView的tableHeaderView來顯示。而在iOS8中,實現方式是這樣的:

首先初始化一個自定義的resultsController,能夠是一個collectionView,也能夠是一些其餘的自定義樣式。以後使用這個resultsController建立一個UISearchController,指定searchController的searchResultsUpdater爲resultsController,以後將searchBar加到tableView的tableHeaderView上,最後,設置當前Controller的definesPresentationContext爲YES,表示UISearchController在present時,能夠覆蓋當前controller。


通過這樣的修改,全部的都變成了Controller,再也不有UIView組件,也再也不須要經過建立新window來展現UIView,更加容易控制。UIPresentationController爲Content與Chrome提供了一個很好的抽象,而且在iPad與iPhone間,自動適應使得編碼更簡潔。