综合技术

UIModalPresentationStyle 各种类型的区别

微信扫一扫,分享到朋友圈

UIModalPresentationStyle 各种类型的区别
0

UIViewController 有个属性 modalPresentationStyle ,它决定了当前控制器 present 出的下一控制器的展示方式。

官方文档对这些效果有比较详细的介绍,这里写个 demo 帮助理解,demo 在模拟器上运行可能会有一点卡顿,真机没有影响。

预备知识

presenting、presented viewController

presentingViewController 指的是 present 出当前控制器的控制器。

presentedViewController 指被当前控制器 present 出的控制器。

Size Class

对于各种常见情况的 Size Class 如下几张图片所示:

iPhonePlus的SizeClass
普通iPhone的SizeClass
全屏iPad的SizeClass

UIModalPresentationStyle

enum UIModalPresentationStyle : Int {
    case fullScreen
    case pageSheet
    case formSheet
    case currentContext
    case custom
    case overFullScreen
    case overCurrentContext
    case popover
    case none
}
复制代码

fullScreen

  • 在各种 Size Class 情况下都是全屏展示
  • 执行 present 操作的控制器的 view 和它的 subViews ,在 present 完成后都会被从当前视图层级移除
fullScreen

对于水平方向为 compact 的情况,不管用哪种 style 推出其他控制器, presentedViewController 都是以 fullScreen 方式展示。所以剩下的所有类型,都只针对水平方向为 regular 论述。

pageSheet

  • 被推出视图部分的遮盖下层视图
  • 其宽度总是为该设备竖屏时候的宽度(不可变),高度则为当前设备方向的屏幕高度(可变,其实还要去掉状态栏的高度)
pageSheet竖屏
pageSheet横屏

formSheet

preferredContentSize
formSheet竖屏
formSheet横屏

这里设置了 preferredContentSize = CGSize(width: 200, height: 200)

currentContext

  • 可以用在 iPad UISplitViewController 中,指定单独覆盖屏幕单侧的控制器; popover 方式展示的控制器,再用该方式 present 出下一视图
  • 在执行 present 操作的控制器的控制器层级中往上查找,如果某个控制器的 definesPresentationContext == true 则它来 present,假如没有一个为 true ,那么则由 window.rootController 来 present
  • 执行 present 操作的控制器的 view 和它的 subViews ,在 present 完成后都会被从当前视图层级移除

definesPresentationContext 默认为 false ,系统提供的一些像 UINavigationController 的控制器,其默认值为 true 。它的定义为:

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.

对于以 currentContext 方式推出的视图,如果它的 presentedViewController 是一个 popover ,那么推出该视图的 modalTransitionStyle 不能是 partialCurl ,否则会引起崩溃。

currentContext竖屏
currentContext横屏
currentContextInPopover

custom

A custom view presentation style that is managed by a custom presentation controller and one or more custom animator objects.

详细介绍在下篇文章中进行。

overFullScreen

基本和 fullScreen 一致。只是 present 完成后,不会移除执行 present 操作的控制器的 view 和它的 subViews 。如果 presentedViewController.view 是有透明度的,底层视图就可以得以显示。

overFullScreen

overCurrentContext

基本和 currentContext 一致。只是 present 完成后,不会移除执行 present 操作的控制器的 view 和它的 subViews 。如果 presentedViewController.view 是有透明度的,底层视图就可以得以显示。

overCurrentContext

popover

  • 在 iPad 上用 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 的实例来管理呈现的行为。

popover
阅读原文...

微信扫一扫,分享到朋友圈

UIModalPresentationStyle 各种类型的区别
0
稀土掘金

kubernetes Pod 资源调度

上一篇

一线|途家宣布加大对自营业务投入 并推出监管解决方案安伴智能

下一篇

评论已经被关闭。

插入图片

热门分类

往期推荐

UIModalPresentationStyle 各种类型的区别

长按储存图像,分享给朋友