在最近的開發需求裡,有一個半透明的頁面,從上到下彈出方式,然後在該彈出視圖上再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的互動方式有了比較深入的了解,以後碰到此類問題,可以快速的選擇合适的方式去搞定各種各樣的需求。