Present ViewController详解

Present ViewController Modally

一、主要用途

  弹出模态ViewController是IOS变成中很有用的一个技术,UIKit提供的一些专门用于模态显示的ViewController,如UIImagePickerController等。弹出模态ViewController主要使用于一下这几种情形:

  1、收集用户输入信息

  2、临时呈现一些内容

  3、临时改变工作模式

  4、相应设备方向变化(用于针对不同方向分别是想两个ViewController的情况)

  5、显示一个新的view层级

  这几种情形都会暂时中断程序正常的执行流程,主要作用是收集或者显示一些信息。

二、几个概念和常用设置

1、presenting view controller Vs presented view controller

  当我们在view controller A中模态显示view controller B的时候,A就充当presenting view controller(弹出VC),而B就是presented view controller(被弹出VC)。官方文档建议这两者之间通过delegate实现交互,如果使用过UIImagePickerController从系统相册选取照片或者拍照,我们可以发现imagePickerController和弹出它的VC之间就是通过UIImagePickerControllerDelegate实现交互的。因此我们在实际应用用,最好也遵守这个原则,在被弹出的VC中定义delegate,然后在弹出VC中实现该代理,这样就可以比较方便的实现两者之间的交互。

2、Modal Presentation Styles(弹出风格)

  通过设置presented VC的modalPresentationStyle属性,我们可以设置弹出View Controller时的风格,有以下四种风格,其定义如下:

typedef enum {UIModalPresentationFullScreen = 0,UIModalPresentationPageSheet,UIModalPresentationFormSheet,UIModalPresentationCurrentContext,
} UIModalPresentationStyle;

  UIModalPresentationFullScreen代表弹出VC时,presented VC充满全屏,如果弹出VC的wantsFullScreenLayout设置为YES的,则会填充到状态栏下边,否则不会填充到状态栏之下。

  UIModalPresentationPageSheet代表弹出是弹出VC时,presented VC的高度和当前屏幕高度相同,宽度和竖屏模式下屏幕宽度相同,剩余未覆盖区域将会变暗并阻止用户点击,这种弹出模式下,竖屏时跟UIModalPresentationFullScreen的效果一样,横屏时候两边则会留下变暗的区域。

  UIModalPresentationFormSheet这种模式下,presented VC的高度和宽度均会小于屏幕尺寸,presented VC居中显示,四周留下变暗区域。

  UIModalPresentationCurrentContext这种模式下,presented VC的弹出方式和presenting VC的父VC的方式相同。

  这四种方式在iPad上面统统有效,但在iPhone和iPod touch上面系统始终已UIModalPresentationFullScreen模式显示presented VC。

3、Modal Transition Style(弹出时的动画风格)

  通过设置设置presented VC的modalTransitionStyle属性,我们可以设置弹出presented VC时场景切换动画的风格,其定义如下:

typedef enum {UIModalTransitionStyleCoverVertical = 0,UIModalTransitionStyleFlipHorizontal,UIModalTransitionStyleCrossDissolve,UIModalTransitionStylePartialCurl,
} UIModalTransitionStyle;

  我们可以看到有从底部滑入,水平翻转进入,交叉溶解以及翻页这四种风格可选。这四种风格在不受设备的限制,即不管是iPhone还是iPad都会根据我们指定的风格显示转场效果。

4、Dismiss Modal ViewController(消失弹出的VC)

  消失presented VC,我们可以通过调用以下两个函数中的任何一个来完成

dismissModalViewControllerAnimated:                 // 将要废弃,不赞成继续使用
dismissViewControllerAnimated:completion:

  谁来调用这消失presented VC的这个方法:正确的做法是“谁污染谁治理”,即presenting VC调用上面的方法来取消presented VC的显示。这样做有一个好处,如果一个VC真不用户做的不同选择可能弹出不同的view controller,当不再需要显示被弹出的view controller的时候,直接调用[self dismissModalViewControllerAnimated]即可使之消失,而不用去关心其具体显示的哪一类view controller。当然系统在这里做了优化,当我们在presented VC里面调用上面的方法的时候,系统会自动的将这个消息传递到相应的presenting VC中,这样就可以实现不管谁弹出了自己,当不再需要的时候直接将自己消失掉的功能。在应用中具体要采用那种要看具体情况,如果presented VC需要和presenting VC有数据传递的话,建议在presenting VC实现的代理函数中dismiss弹出的view controller

转载于:https://www.cnblogs.com/chenhaosuibi/p/3497663.html

presenting view controller相关推荐

  1. 0306--iOS之阅读View Controller Programming Guide for iOS---(三)Presentations and Trasitions

    Presenting a View Controller                                                 --显示vc There are two wa ...

  2. 关于Page翻页效果--Page View Controller

    Page View Controllers 你使用一个page view controller用page by page的方式来展示内容.一个page view controller管理一个self- ...

  3. 关于Presenting view controllers on detached view ...

    为什么80%的码农都做不了架构师?>>>    使用模态跳转,Xcode有时候会出现 Presenting view controllers on detached view con ...

  4. 关于创建Custom Container View Controller

    在我们现实的项目中,很多刚入行的工程师可能不会很在意controller的设计概念,因为接到的项目有限,而且多数公司的项目架构已经由主程开发好了,所以能接触到的只不过是一些功能模块,这对一个程序员的发 ...

  5. 打造轻量化的View Controller

    2019独角兽企业重金招聘Python工程师标准>>> 本文由破船译自objc 小引 很早以前就看到了这篇文章,该文是Lighter View Controllers中比较重要的一篇 ...

  6. iOS 因为reason: 'Pushing the same view controller instance more than once is not supported而奔溃(下)...

    这个问题是什么意思呢,之前遇到过几次,但程序再次打开时没有问题,也就没有重视,今天又遇到了,无法忍受啊. 控制台报的错误是:"不支持多次推入相同的视图控制器实例". 什么原因造成的 ...

  7. SAP UI5 视图控制器 View Controller 的生命周期方法 - Lifecycle methods

    SAPUI5 View Controller lifecycle methods Create an Application Project for SAPUI5 打开 Eclipse 并转到菜单选项 ...

  8. SAP UI5 view controller lifecycle discussion - onInit

    Created by Jerry Wang, last modified on Aug 08, 2014 新建一个view instance: Callstack2: 这个view的实例化会调用下图所 ...

  9. view controller lifecycle discussion - onInit

    Created by Jerry Wang, last modified on Aug 08, 2014 新建一个view instance: Callstack2: 这个view的实例化会调用下图所 ...

  10. Swift3.0中如何完成不同View Controller之间的切换

    在网上看过一些关于View Controller之间的切换的介绍,但是由于我使用的是swift3.0,所以在一些语法上面有写不同,但是思路还是一样的.下面是我整理的一些关于swift3.0中View ...

最新文章

  1. vue中动态样式不起作用? scoped了解一下
  2. python中完善decorator
  3. 程序员买买买,纸书半价,电子书55折,抢券叠加使用更划算
  4. 这个重量级产业,中国正在爆发!
  5. FPGA的设计艺术(4)STA实战之不同时序路径的建立保持时间计算
  6. Xshell 连接 Ubuntu
  7. 为什么说C语言是面向过程的?
  8. NaN Inf(OC)
  9. idea中连接mysql插入成功数据 在navicat中刷新表格没有数据_第九篇 数据分析的进阶学习-SQL入门...
  10. 程序员最痛苦的事,就是程序出错;程序员最最痛苦的事,就是程序出错了还没有错误信息!--IIS Service Unavailable 问题如何解决...
  11. 简明 ASP.NET Core 手册
  12. 微软笔试题(看到的写答案啊)
  13. 百度 ERNIE 在 GLUE 大赛中击败了微软和谷歌
  14. VS2017不能打开stdio.h等文件
  15. HTML5 植物大战僵尸项目介绍 和源码分析
  16. 主流NoSQL数据库评测之HandlerSocket
  17. idea热部署(更新jsp代码不用重编译Tomcat)
  18. 基于springboot点餐系统java web订餐管理平台源码
  19. 十个Win10使用小技巧,看看你知道哪些?
  20. J0007. 华为手机怎么开启开发者选项

热门文章

  1. 《Plants Vs Zombies(植物大战僵尸)》游戏存档修改
  2. 植物大战僵尸_修改存档和金钱
  3. ALSA驱动框架简介
  4. TPshop商城——windows部署(保姆级)
  5. SAP系统中的几种系统级消息(用户登录后消息弹窗SM02,TH_POPUP,以及系统邮件)
  6. QML 全屏 输入法无法显示
  7. oracle 增量导出 导入,Oracle增量导入导出
  8. 国内外CRM系统软件功能对比
  9. 【sv】for循环+fork-join_none结构的坑
  10. 洛谷 P3137 [USACO16FEB]圆形谷仓Circular Barn_Silver