有兩種方法實現一個視圖控制器到屏幕上:把它嵌入到一個容器視圖控制器或者是直接呈現它。容器視圖控制器提供一個應用程序主要的導航功能,但是present 視圖控制器也是一個重要的導航工具。你可以直接使用presentation 在當前視圖控制器的最上層顯示一個新的視圖控制器。典型地,當你想要實現模態界面的時候直接present 視圖控制器,但是你也可以基於其它目的使用它們。
對呈現視圖控制器的支持內建於類UIViewController中,而且對所有的視圖控制器對象都是有效的。你可以在其它任何視圖控制器上present 任何視圖控制器,盡管UIKit可能會對不同的視圖控制器改變要求。Present 一個視圖控制器在原始的視圖控制器(被稱作presenting 視圖控制器)和新的將被陳列的視圖控制器(被稱作presented 視圖控制器)之間建立一種關系。這種關系形成了視圖控制器層次結構的一部分,而且在合適的位置一直保留,直到presented 視圖控制器被dismiss。
展示(Presentation)和過度(Transition)過程
呈現一個視圖控制器是一個快捷和容易的方式用來animate 新的內容到屏幕上。presentation機械裝置內置在UIKit中,讓你使用內置或者自定義動畫(animations)的方式來顯示一個新的視圖控制器。內置的presentations 和 animations 僅僅需要非常少的代碼,因為UIkit為你處理所有的工作。你也可以創建自定義的presentations和animations,也僅僅需要一點額外的努力,可以在你的任何視圖控制器中使用它們。
你可以通過編碼的方式或者使用segues 來開始一個視圖控制器的presentation。如果在設計的時候你了解你的應用程序的導航功能,segues 是開始presentations的最簡單方式。對於更多的動態界面,或者萬一沒有專用的控制來開始segue, 那麼使用UIViewController的方法來呈現你的視圖控制器。
presentation styles
一個視圖控制器的presentation style 決定它在屏幕上的顯示。UIKit 定義了許多標准的presentation風格,一個特定的顯示和意圖。你也可以定制你自己的presentation風格。當設計你的app的時候,為你想要做的事情選擇最合適的presentation風格,給你想要呈現的視圖控制器的modalPresentationsStyle 屬性指定合適的常量。
Full-Screen Presentation style
全屏presentation styles 覆蓋整個屏幕,阻止視圖控制器與底層的內容交互。在一個水平的regular 環境中,只有全屏風格視圖中的一個完全覆蓋了底層的內容。如果全屏的視圖包含變暗或者透明的部分,那麼允許底層視圖控制器對應的部分穿過全屏視圖顯示出來。在水平的compact 環境中,全屏presentation 自動適應UIModalPresentationFullScreen 風格,覆蓋位於頂層視圖之下的內容。
圖8-1 使用 UIModalPresentationFullScreen
,UIModalPresentationPageSheet
, andUIModalPresentationFormSheet
styles,來舉例說明在一個水平的regular 環境中presentations的顯示。在圖中,綠色的視圖控制器在左上角顯示,藍色的視圖控制器在右上角顯示,每個presentation 的風格都顯示在下面。對於一些presentation 風格,UIKit 在兩個視圖控制器的內容之間插入了一個暗淡的視圖。
圖8-1全屏presentation styles
-注意:當使用UIModalPresentationFullScreen 呈現一個視圖控制器的時候,在切換動作(transition animations)完成之後,UIKit 通常移除當前視圖之下的視圖控制器。你可以通過指定UIModalPresentationOverFullScreen
風格來阻止移除這些視圖控制器。當presented視圖控制器有透明區域的時候,你可能使用這個風格,它可以讓底下的內容穿過透明區域顯示出來。
當使用全屏幕presentation 風格中的一種的時候,這個視圖控制器開始presentation時必須自己覆蓋整個屏幕。如果presenting視圖控制器沒有覆蓋整個屏幕,那麼UIKit喚醒這個視圖控制器層次結構直到它找到一個正在工作的視圖控制器。如果沒有找到一個中間視圖控制器來填充屏幕,那麼UIKit使用窗口的根視圖來填充。
The Popover style
UIModalPresentationPopover
風格在一個popover 視圖中顯示一個視圖控制器。Popovers 是有用的,在為一個焦點對象或者是被選擇的對象顯示額外的信息或者列出相關的項。在一個水平的regular 環境中,popovers視圖僅僅覆蓋屏幕的一部分,如圖8-2所示。在一個水平的compact 環境中,popovers默認適應UIModalPresentationOverFullScreen
presentation風格。在popover視圖之外點擊屏幕就可以自動地dismiss popover視圖。
圖8-2 The popover presentation style
因為在一個水平的compact 環境中, popovers自動適應full-screen presentations,你通常需要修改你的popover代碼來處理這種適應。在full-screen模式下,你需要一個方法來dismiss一個presented popover。你可以通過增加一個按鈕,把popover嵌入到一個dismissible 容器視圖控制器或者改變它自己的適應行為來實現。更多關於怎樣配置一個popover presentation 的技巧,seePresenting a View Controller in a Popover.
The Current Context Styles
在你的界面中UIModalPresentationCurrentContext
風格覆蓋一個指定的視圖控制器。當使用contextual 風格時,你通過設置它的definesPresentationContext 屬性為YES來指定你想要覆蓋的視圖。圖8-3舉例說明了一個當前的context presentation 僅僅覆蓋了split 視圖控制器的一個子視圖控制器。
圖8-3 The current context presentation style
-注意:當使用UIModalPresentationFullScreen風格來呈現一個視圖控制器的時候,在切換動作完成後,UIKit自動移除底層的視圖。你可以通過指定UIModalPresentationOverCurrentContext
風格來阻止移除這些視圖。當presented視圖控制器有透明區域的時候你可能使用這種風格來讓之下的內容穿過透明區域顯示出來。
在presentation期間,視圖控制器定義presentation 上下文環境,也可以定義過渡動畫來使用。通常的,UIKit 在屏幕上animates 視圖控制器使用的是presented視圖控制器的modalTransitionStyle 屬性的值。如果presentation上下文視圖控制器的providesPresentationContextTransitionStyle
設置為了YES,那麼UIKit使用這個視圖控制器的modalTransitionStyle 屬性的值。
當切換到一個水平的compact 環境中時,當前的context styles 自動適應UIModalPresentationFullScreen
風格。為了改變這種行為,使用一個適配的presentation delegate 來指定一個不同的presentation 風格或者視圖控制器。
Custom Presentation Styles
UIModalPresentationCustom
風格讓你使用你自定義的風格來呈現一個視圖控制器。創建一個定制的style 涉及到子類化UIPresentationController
,使用它的方法來animate 任意定制的視圖到屏幕上,為presented視圖控制器設置大小和位置。因為變更為了presented視圖控制器的traits,presentation視圖控制器也處理發生的任何適應性。更多關於怎樣定義個定制的presentation控制器的內容,seeCreating Custom Presentations。