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
的样式展现了