UIViewController
有個屬性modalPresentationStyle
,它決定了當前控制器 present 出的下一控制器的展現方式。html
官方文檔對這些效果有比較詳細的介紹,這裏寫個 demo 幫助理解,demo 在模擬器上運行可能會有一點卡頓,真機沒有影響。git
presentingViewController
指的是 present 出當前控制器的控制器。github
presentedViewController
指被當前控制器 present 出的控制器。swift
對於各類常見狀況的 Size Class 以下幾張圖片所示:app
enum UIModalPresentationStyle : Int {
case fullScreen
case pageSheet
case formSheet
case currentContext
case custom
case overFullScreen
case overCurrentContext
case popover
case none
}
複製代碼
view
和它的subViews
,在 present 完成後都會被從當前視圖層級移除對於水平方向爲 compact 的狀況,無論用哪一種 style 推出其餘控制器,presentedViewController
都是以fullScreen
方式展現。因此剩下的全部類型,都只針對水平方向爲 regular 論述。this
preferredContentSize
來設置它的大小這裏設置了preferredContentSize = CGSize(width: 200, height: 200)
。url
UISplitViewController
中,指定單獨覆蓋屏幕單側的控制器;popover
方式展現的控制器,再用該方式 present 出下一視圖definesPresentationContext == true
則它來 present,假如沒有一個爲true
,那麼則由 window.rootController
來 presentview
和它的subViews
,在 present 完成後都會被從當前視圖層級移除definesPresentationContext
默認爲false
,系統提供的一些像UINavigationController
的控制器,其默認值爲true
。它的定義爲:spa
A Boolean value that indicates whether this view controller's view is covered when the view controller or one of its descendants presents a view controller.3d
對於以currentContext
方式推出的視圖,若是它的presentedViewController
是一個popover
,那麼推出該視圖的modalTransitionStyle
不能是partialCurl
,不然會引發崩潰。代理
A custom view presentation style that is managed by a custom presentation controller and one or more custom animator objects.
詳細介紹在下篇文章中進行。
基本和fullScreen
一致。只是 present 完成後,不會移除執行 present 操做的控制器的view
和它的subViews
。若是presentedViewController.view
是有透明度的,底層視圖就能夠得以顯示。
基本和currentContext
一致。只是 present 完成後,不會移除執行 present 操做的控制器的view
和它的subViews
。若是presentedViewController.view
是有透明度的,底層視圖就能夠得以顯示。
popover
的方式顯示;在 iPhone 上默認用fullScreen
方式顯示,可是在 iOS8 後能夠設置成popover
的方式,在none
中會進行解釋popover
會直接消失,經過presentedViewController.popoverPresentationController?.passthroughViews
能夠配置灰色背景的哪些視圖區域能夠點擊UIPopoverPresentationController
的定義:
An object that manages the display of content in a popover.
當視圖被用popover
方式 present 的時候,總有一個popoverPresentationController
的實例來管理呈現的行爲。
modalPresentationStyle
popoverPresentationController
會調用它delegate
的方法來配置popover
的視圖,none
只能用在adaptivePresentationStyle(for:)
代理方法中返回,告訴popoverPresentationController
不要適配presentedViewController
,這樣在 iPhone 中也能夠用popover
的樣式展現了