UIModalPresentationStyle 各种类型的区别
UIViewController
有个属性modalPresentationStyle
,它决定了当前控制器 present 出的下一控制器的展示方式。
官方文档对这些效果有比较详细的介绍,这里写个 demo 帮助理解,demo 在模拟器上运行可能会有一点卡顿,真机没有影响。
预备知识
presenting、presented viewController
presentingViewController
指的是 present 出当前控制器的控制器。
presentedViewController
指被当前控制器 present 出的控制器。
Size Class
对于各种常见情况的 Size Class 如下几张图片所示:
UIModalPresentationStyle
enum UIModalPresentationStyle : Int {case fullScreencase pageSheetcase formSheetcase currentContextcase customcase overFullScreencase overCurrentContextcase popovercase none
}
复制代码
fullScreen
- 在各种 Size Class 情况下都是全屏展示
- 执行 present 操作的控制器的
view
和它的subViews
,在 present 完成后都会被从当前视图层级移除
对于水平方向为 compact 的情况,不管用哪种 style 推出其他控制器,presentedViewController
都是以fullScreen
方式展示。所以剩下的所有类型,都只针对水平方向为 regular 论述。
pageSheet
- 被推出视图部分的遮盖下层视图
- 其宽度总是为该设备竖屏时候的宽度(不可变),高度则为当前设备方向的屏幕高度(可变,其实还要去掉状态栏的高度)
formSheet
- 被推出视图大小比屏幕的小,且总是居中显示
- 在横屏时,如果弹出了键盘,视图位置会跟着上移
- 可以设置被推出视图的
preferredContentSize
来设置它的大小
这里设置了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
,否则会引起崩溃。
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
是有透明度的,底层视图就可以得以显示。
overCurrentContext
基本和currentContext
一致。只是 present 完成后,不会移除执行 present 操作的控制器的view
和它的subViews
。如果presentedViewController.view
是有透明度的,底层视图就可以得以显示。
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
的实例来管理呈现的行为。
none
- 该枚举值不可以直接赋值给
modalPresentationStyle
popoverPresentationController
会调用它delegate
的方法来配置popover
的视图,none
只能用在adaptivePresentationStyle(for:)
代理方法中返回,告诉popoverPresentationController
不要适配presentedViewController
,这样在 iPhone 中也可以用popover
的样式展示了
UIModalPresentationStyle 各种类型的区别相关推荐
- go 方法接受者 是指针类型和非指针类型的 区别
go 方法接受者 是指针类型和非指针类型的 区别 非指针类型 package mainimport "fmt"// 定义接口 type Car interface {GetName ...
- 数据库中的字段varchar类型和char类型的区别?
数据库中的字段varchar类型和char类型的区别? 目录 数据库中的字段varchar类型和char类型的区别?
- mysql timestamp json_mysql中timestamp,datetime,int类型的区别与优劣
mysql中timestamp,datetime,int类型的区别与优劣 int 1. 占用4个字节 2. 建立索引之后,查询速度快 3. 条件范围搜索可以使用使用between 4. 不能使用mys ...
- reg类型变量综合电路_verilog中reg和wire类型的区别
verilog 中 reg 和 wire 类型的区别 reg 相当于存储单元, wire 相当于物理连线 Verilog 中变量的物理数据分为线型和寄存器型.这两种类型的变量在定义时要 设置位宽,缺省 ...
- [转载]实际举例C#引用类型和值类型的区别
http://www.cnblogs.com/coolbeibei/archive/2009/03/23/1419706.html 实际举例C#引用类型和值类型的区别 我们都知道,c#的两大数据类型分 ...
- Database:Database数据库的简介、类型及其区别(关系数据库VS非关系型数据库)、案例应用之详细攻略
Database:Database数据库的简介.类型及其区别(关系数据库VS非关系型数据库).案例应用之详细攻略 目录 Database数据库的简介 1.掌握数据库的方法-学会sql语言进而学会增.删 ...
- c#和c++中枚举类型的区别(简)
c#和c++中枚举类型的区别(简) C++中 枚举类型中的每个元素,可以直接使用,不必通过类型.元素的方式调用 没有++操作 #include <iostream> using names ...
- Verilog中wire与reg类型的区别
这是事转载的一篇文章,觉得不错,虽然中间有点小错误. wire与reg类型的区别: wire型数据常用来表示以assign关键字指定的组合逻辑信号.模块的输入输出端口类型都默认为wire型.默认初始值 ...
- 在Oracle中CHAR,NCHAR,VARCHAR,VARCHAR2,NVARCHAR2这五种类型的区别
[在Oracle中CHAR,NCHAR,VARCHAR,VARCHAR2,NVARCHAR2这五种类型的区别 ] 1.CHAR(size)和VARCHAR(size)的区别 CHAR为定长的字段,最 ...
最新文章
- 【Interfacenavigation】选择时间/日期组件(34)
- uc3842开关电源电路图_UC3842构成的开关电源电路
- C#winform listbox多选的取值,采用DataRowView
- 记账本小程序7天开发记录(第二天)
- 【2】最简单的Laravel5.1程序分析
- 2012-2013年度大总结
- 简单总结手机app测试,弱网测试
- C#中类的默认构造函数对类中属性值的初始化情况
- hdu 1978 How many ways(dp)
- 概率图模型(PGM):贝叶斯网(Bayesian network)初探
- Hp-socket高性能网络库三--tcp组件pack接收模型
- 前端小白的挖坑填坑之路。
- click option/argument参数详解(click.option()和click.argument())
- 开篇 :直播软件分析.
- IP地址计算---子网掩码确定和子网划分等详解 (附常见相关习题)
- STM32+ESP8266使用MQTTAT固件连接云
- c语言编程华容道,C/C++仿华容道小游戏
- 使用Python一键删除全盘文件自动关机并留后门
- 2021年最实用的12款SEO工具
- c++ 回车键无法换行
热门文章
- BZOJ 2007: [Noi2010]海拔
- jsp中session 和 cookies区别
- qmenubar无边框 qt_Qt UI测试:如何模拟使用QTest QMenuBar项目上的点击?
- python 倒计时_Excel制作竞答倒计时器
- 注释数据库介绍之GO、KEGG数据库
- 使用node和npmVS时出现的问题
- Python IDLE 如何清屏
- 问题 | 0x00007FF95287908C 处(位于 OpenCV.exe 中)有未经处理的异常: Microsoft C++ 异常: cv::Exception
- Oracle 11g 安装后续——开发工具篇
- 使用numpy遇到ValueError: The truth value of an array with more than one element is ambiguous