`

【iOS】正确使用PresentModalViewController

    博客分类:
  • iOS
阅读更多

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(弹出风格)

  通过设置presenting 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(弹出时的动画风格)

  通过设置设置presenting 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。

分享到:
评论

相关推荐

    presentModalViewController实现的启动动画

    `presentModalViewController`自iOS 8之后已经被废弃,但在iOS 7及更早版本中广泛使用。现在,我们通常会使用`UINavigationController`的`pushViewController:animated:`或`present:animated:completion:`来替代。 ...

    unity for ios 上传IOS机本地的头像 相机的获取 相册的获取 截图拍照

    在Unity引擎中开发iOS应用时,涉及到...理解并正确使用这些功能,可以创建出用户体验优秀的iOS应用。在开发过程中,务必注意遵守iOS平台的规范和用户隐私政策,确保应用能够顺利通过审核并为用户提供安全、便捷的服务。

    IOS 二维码扫描 ZBar和Zxing

    对于弹出式ViewController,通常会使用UIStoryboardSegue或者presentModalViewController来展示扫描界面,用户扫描完成后,通过代理或者闭包将结果返回到主界面。而对于自定义嵌入界面,你可能需要在你的主界面中...

    iOS工程师培养计划

    - 显示模态视图控制器的方法:`presentModalViewController` #### 三、其他关键技能 - **XCode调试技巧**:掌握使用Xcode工具进行调试的关键技巧,如使用`Leak`、`Profile`、`Clog`等功能进行性能优化。 - **常用...

    ios 使用ZBar读取条形码和二维码

    这篇博客文章“ios 使用ZBar读取条形码和二维码”提供了一个详细教程,教你如何集成ZBar库并实现扫描功能。 首先,我们需要了解ZBar库。ZBar是由Simon Woodside开发的一个图像识别库,专门用于解析一维条形码和二维...

    IOS源码之页面之间数据传送(通过delegate)

    首先,我们需要了解什么是代理以及如何设置和使用。 代理(Delegate)是一种设计模式,它允许对象之间进行松散耦合的通信。在iOS中,我们通常通过遵循特定的协议(Protocol)来实现代理。在这个例子中,我们将创建...

    iOS block传值

    跳转到第二个页面时,确保正确设置NavigationController或者使用presentModalViewController。完成数据传递后,记得在适当的时候销毁Block,以避免循环引用问题。 6. **内存管理**: 注意Block会捕获其作用域内的...

    IOS 图片上传处理 图片压缩 图片处理 --X枫林1

    在iOS中,我们可以使用`UIImagePickerController`这个系统提供的组件来实现这一功能。`UIImagePickerController`允许用户从相册或相机中选择图片。以下代码展示了如何初始化并展示一个`UIImagePickerController`: ...

    ModalViewDemo

    在iOS应用开发中,`ModalViewDemo`是一个常见的示例,它涉及到如何使用`presentModalViewController`方法来显示一个模态视图控制器。模态视图控制器(Modal View Controller)是一种设计模式,它用于在当前界面之上...

    iOS应用开发中实现页面跳转的简单方法笔记

    对于不涉及导航堆栈的情况,我们可以选择直接跳转到新的页面,例如使用`presentModalViewController:animated:`(iOS 6.0之前)或`presentViewController:animated:completion:`(iOS 6.0及以后版本)。这种方式通常...

    iOS页面跳转及数据传递(三种)

    可以使用 `presentModalViewController:animated:` 来显示一个新的控制器,该控制器会覆盖当前视图。而 `dismissModalViewControllerAnimated:` 用于关闭模态视图,返回到之前的状态。 3. **直接添加视图(Add ...

    第七节 利用ModalViewController切换View.docx

    在iOS中,`ModalViewController`并不是一个独立的类,而是通过调用`UIViewController`的`presentModalViewController:animated:`方法来实现的。当一个`UIViewController`呈现另一个`UIViewController`时,被呈现的...

    iOS开发中ViewController的页面跳转和弹出模态

    2. **利用UIViewController的presentModalViewController方法**: 这种方式是不使用NavigationController的直接跳转。通过调用`present(_:animated:completion:)`,你可以将一个ViewController覆盖在当前...

    IOS Xib控件拖拽与页面跳转实例

    在iOS应用中,常见的页面跳转方式有模态弹出(`presentModalViewController:animated:`)、导航控制器的推送(`pushViewController:animated:`)以及使用`UIStoryboardSegue`进行跳转。在上述示例中,使用的是导航...

    IOS 下获取 rootviewcontroller 的版本不同的问题解决办法

    IOS 下获取 rootviewcontroller 的版本不同的问题解决办法 一般 原生的 [[UIApplication sharedApplication].keyWindow.rootViewController presentModalViewController:self animated:NO]; 可以 获取 系统的 ...

    iOS中视频播放的基本方法总结

    使用步骤类似MPMoviePlayerController,但通常通过presentModalViewController方法显示。 三、AVPlayer AVFoundation框架中的AVPlayer提供更高级别的视频播放功能,支持更灵活的控制和更强大的视频处理。创建...

    UIImagePickerController拍照与摄像

    完成配置后,将其push到导航控制器的栈中,或者使用presentModalViewController来展示,以便用户进行交互。 在用户完成拍摄或选择后,UIImagePickerController会调用其代理对象实现的协议方法。我们通常需要遵循...

    VideoCamera2

    iOS 相机的调用,相册使用方法 UIImagePickerControllerSourceType sourceType = UIImagePickerControllerSourceTypeCamera; // if (![UIImagePickerController isSourceTypeAvailable: ...

    Xamarin Froms 调用相机拍照和图库选择图片

    在移动应用开发中,Xamarin.Forms 是一个强大的跨平台框架,允许开发者使用 C# 和 .NET 库创建原生 iOS、Android 和 UWP 应用。本教程将深入探讨如何在 Xamarin.Forms 应用中调用设备的相机进行拍照以及访问图库选择...

    ZBarSDK-64_Demo

    1. **启动相机**:调用`presentModalViewController:animated:`展示ZBarReaderController,启动相机预览。 2. **实时扫描**:ZBarReaderController会自动检测并解码摄像头画面中的二维码。 3. **处理结果**:当识别...

Global site tag (gtag.js) - Google Analytics