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 fullScreencase pageSheetcase formSheetcase currentContextcase customcase overFullScreencase overCurrentContextcase popovercase 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

  • 可以用在 iPadUISplitViewController中,指定单独覆盖屏幕单侧的控制器;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

none

  • 该枚举值不可以直接赋值给modalPresentationStyle
  • popoverPresentationController会调用它delegate的方法来配置popover的视图,none只能用在adaptivePresentationStyle(for:)代理方法中返回,告诉popoverPresentationController不要适配presentedViewController,这样在 iPhone 中也可以用popover的样式展示了
none

UIModalPresentationStyle 各种类型的区别相关推荐

  1. go 方法接受者 是指针类型和非指针类型的 区别

    go 方法接受者 是指针类型和非指针类型的 区别 非指针类型 package mainimport "fmt"// 定义接口 type Car interface {GetName ...

  2. 数据库中的字段varchar类型和char类型的区别?

    数据库中的字段varchar类型和char类型的区别? 目录 数据库中的字段varchar类型和char类型的区别?

  3. mysql timestamp json_mysql中timestamp,datetime,int类型的区别与优劣

    mysql中timestamp,datetime,int类型的区别与优劣 int 1. 占用4个字节 2. 建立索引之后,查询速度快 3. 条件范围搜索可以使用使用between 4. 不能使用mys ...

  4. reg类型变量综合电路_verilog中reg和wire类型的区别

    verilog 中 reg 和 wire 类型的区别 reg 相当于存储单元, wire 相当于物理连线 Verilog 中变量的物理数据分为线型和寄存器型.这两种类型的变量在定义时要 设置位宽,缺省 ...

  5. [转载]实际举例C#引用类型和值类型的区别

    http://www.cnblogs.com/coolbeibei/archive/2009/03/23/1419706.html 实际举例C#引用类型和值类型的区别 我们都知道,c#的两大数据类型分 ...

  6. Database:Database数据库的简介、类型及其区别(关系数据库VS非关系型数据库)、案例应用之详细攻略

    Database:Database数据库的简介.类型及其区别(关系数据库VS非关系型数据库).案例应用之详细攻略 目录 Database数据库的简介 1.掌握数据库的方法-学会sql语言进而学会增.删 ...

  7. c#和c++中枚举类型的区别(简)

    c#和c++中枚举类型的区别(简) C++中 枚举类型中的每个元素,可以直接使用,不必通过类型.元素的方式调用 没有++操作 #include <iostream> using names ...

  8. Verilog中wire与reg类型的区别

    这是事转载的一篇文章,觉得不错,虽然中间有点小错误. wire与reg类型的区别: wire型数据常用来表示以assign关键字指定的组合逻辑信号.模块的输入输出端口类型都默认为wire型.默认初始值 ...

  9. 在Oracle中CHAR,NCHAR,VARCHAR,VARCHAR2,NVARCHAR2这五种类型的区别

    [在Oracle中CHAR,NCHAR,VARCHAR,VARCHAR2,NVARCHAR2这五种类型的区别 ] 1.CHAR(size)和VARCHAR(size)的区别  CHAR为定长的字段,最 ...

最新文章

  1. 【Interfacenavigation】选择时间/日期组件(34)
  2. uc3842开关电源电路图_UC3842构成的开关电源电路
  3. C#winform listbox多选的取值,采用DataRowView
  4. 记账本小程序7天开发记录(第二天)
  5. 【2】最简单的Laravel5.1程序分析
  6. 2012-2013年度大总结
  7. 简单总结手机app测试,弱网测试
  8. C#中类的默认构造函数对类中属性值的初始化情况
  9. hdu 1978 How many ways(dp)
  10. 概率图模型(PGM):贝叶斯网(Bayesian network)初探
  11. Hp-socket高性能网络库三--tcp组件pack接收模型
  12. 前端小白的挖坑填坑之路。
  13. click option/argument参数详解(click.option()和click.argument())
  14. 开篇 :直播软件分析.
  15. IP地址计算---子网掩码确定和子网划分等详解 (附常见相关习题)
  16. STM32+ESP8266使用MQTTAT固件连接云
  17. c语言编程华容道,C/C++仿华容道小游戏
  18. 使用Python一键删除全盘文件自动关机并留后门
  19. 2021年最实用的12款SEO工具
  20. c++ 回车键无法换行

热门文章

  1. BZOJ 2007: [Noi2010]海拔
  2. jsp中session 和 cookies区别
  3. qmenubar无边框 qt_Qt UI测试:如何模拟使用QTest QMenuBar项目上的点击?
  4. python 倒计时_Excel制作竞答倒计时器
  5. 注释数据库介绍之GO、KEGG数据库
  6. 使用node和npmVS时出现的问题
  7. Python IDLE 如何清屏
  8. 问题 | 0x00007FF95287908C 处(位于 OpenCV.exe 中)有未经处理的异常: Microsoft C++ 异常: cv::Exception
  9. Oracle 11g 安装后续——开发工具篇
  10. 使用numpy遇到ValueError: The truth value of an array with more than one element is ambiguous