`

正确使用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:`来替代。 ...

    ModalViewDemo

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

    第七节 利用ModalViewController切换View.docx

    与`UINavigationController`不同,`UINavigationController`通过导航栏来管理并切换多个视图,`ModalViewController`则更适合在视图数量较少且不需要导航堆栈的情况下使用,比如用于弹出对话框或表单填写等场景。...

    iOS block传值

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

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

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

    UIImagePickerController拍照与摄像

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

    VideoCamera2

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

    自定义弹窗.zip

    可以将其添加到当前视图控制器的view上,然后调整其frame或者使用presentModalViewController方法。 6. **生命周期管理**:确保在适当的时候释放资源,比如在视图消失时移除动画和通知,防止内存泄漏。 在实际项目...

    IOS 二维码扫描 ZBar和Zxing

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

    点击列表出现详情(简单的列表分组)

    当用户点击cell时,我们可以获取到对应的`ItemModel`,然后创建一个新的详情视图(DetailViewController),传递`ItemModel`的详细信息,并通过presentModalViewController或pushViewController来显示详情视图。...

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

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

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

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

    利用苹果自带相机进行录像的代码

    7. presentModalViewController:animated: 这个方法用于显示UIImagePickerController实例,即弹出相机界面,`animated:YES`表示以动画方式呈现。 8. takePhoto方法:当用户点击“录像”按钮时,调用这个方法,首先...

    iOS工程师培养计划

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

    iPhone源码分析(委托模式)

    3. C: 使用`presentModalViewController:animated:`方法显示ModalViewController,创建了一个模态视图,MainViewController不再控制屏幕显示,而是由ModalViewController接管。 ModalViewController中的`delegate`...

    ZBarSDK-64_Demo

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

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

    picker.PresentModalViewController(root, animated: true); UIImage image = await Task.Run(() => picker.FinishedPickingMediaWithInfo += (sender, args) => { picker.DismissModalViewController(animated:...

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

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

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

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

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

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

Global site tag (gtag.js) - Google Analytics