iOS Modal出半透明控制器

在最近的开发需求里,有一个半透明的页面,从上到下弹出方式,然后在该弹出视图上再Modal和Push其他的页面,之前常规的做法是选择view添加到keyWindow上:

1、如果选择View来完成,modal出一个新页面

[[UIApplication sharedApplication].keyWindow addSubview:self];

由于弹出视图是添加在keyWindow上,modal出的新页面会在弹出的view之下

2.选择添加到window上,显示不会有问题

[[[UIApplication sharedApplication].delegate window] addSubview:self];
//在其他页面modal或push前将视图置于盒子下方
[[[UIApplication sharedApplication].delegate window] sendSubviewToBack:self];
//在返回到该弹窗页面时再将弹窗页面显示在最上方
[[[UIApplication sharedApplication].delegate window] bringSubviewToFront:self];

利用第二种方式能够较好的处理半透明弹窗的显示以及后续的Modal和Push交互,不过该方式在利用View数据传递和交互方式上会有诸多不便,遂考虑使用Modal出控制器的方式,利用VC去做数据传递与交互会便捷很多。

3、选择modal出一个控制器
需要设置modal的style

let modalVC = ModalViewController();
modalVC.modalPresentationStyle = .overCurrentContext
self.navigationController?.present(modalVC, animated: true, completion: nil)
//设置modalVC的背景颜色
view.backgroundColor = UIColor.init(red: 0/255.0, green: 0/255.0, blue: 0/255.0, alpha: 0.22)

单单是这样的方式,已经能够满足弹出半透明视图的要求,因为是VC弹出视图后的数据传递与交互方式会很简便。
但是需求总是各种各样的令人匪夷所思的脑洞大开的交互方式:


WechatIMG11.jpeg

再Modal出的半透明A VC上后续还有Modal和Push出B VC的交互方式,接下来继续踩坑之路。。。

4.Modal+Push的交互方式
常规的使用Modal+Push的方式,需要使用UINavigationController包装Modal的VC,然后才能Push到另一个VC,于是需要对Modal出的半透明VC经过一层包装

let modalVC = ModalViewController();
modalVC.modalPresentationStyle = .overCurrentContext
let nav = UINavigationController(rootViewController: modalVC)
self.navigationController?.present(nav, animated: true, completion: nil)

经过这样的设置后,会惊奇的发现,之前Modal出得半透明控制器不再透明了!开始排查问题,查看view的层级结构,发现是UINavigationController的背景遮盖导致弹出的半透明VC不再透明,随即设置nav的背景颜色为clear

nav.view.backgroundColor = .clear

run起来,结果背景变为黑色了,经过一番调试,无论设置什么颜色,都无法modal出之前半透明的VC了,一顿操作猛如虎然并卵后尝试使用同样的方式去设置nav

nav.modalPresentationStyle = .overCurrentContext

见证奇迹的时刻终于到来,完美的达到了想要的效果!其中这两行代码值千金:

nav.modalPresentationStyle = .overCurrentContext
nav.view.backgroundColor = .clear

只有加上这两行代码设置,才能完美的达到Modal出半透明的VC,并在该VC上进行Modal+Modal,Modal+Push的交互。

采用方式1去加载常规的弹窗没问题,但如果涉及到交互弹出其他视图时keyWindow addSubview的方式就会存在坑,半透明的视图弹出交互多的最好使用VC更加方便。经过这次踩坑,对弹出视图中组合Modal与Push的交互方式有了比较深入的了解,以后碰到此类问题,可以快速的选择合适的方式去搞定各种各样的需求。

你可能感兴趣的:(iOS Modal出半透明控制器)