iOS开发弹出半透明视图

一、项目问题

项目中经常会遇到需要弹出一个半透明视图的情况,先前自己想着用UIWindow做,后来发现因为界面控制器复杂不好管理,于是放弃,度娘了一下,发现直接用modal的方法就可实现,简单又明了。先上效果图:


iOS开发弹出半透明视图_第1张图片

关键代码如下:

AddTimerController *addVC = [[AddTimerController alloc] init];

addVC.addModel = self.model;

self.definesPresentationContext = YES;

addVC.modalPresentationStyle = UIModalPresentationOverCurrentContext;

[self.rt_navigationController presentViewController:addVC animated:NO completion:^{

UIColor *color = [UIColor blackColor];

addVC.view.backgroundColor = [color colorWithAlphaComponent:0.5];

}];

AddTimerController即目标控制器类。

二、相关点解释

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的这个方法:正 确的做法是“谁污染谁治理”,即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://blog.csdn.net/msyqmsyq/article/details/50739139

你可能感兴趣的:(iOS开发弹出半透明视图)