天天看點

ios 設定控制器背景半透明_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彈出視圖後的資料傳遞與互動方式會很簡便。

但是需求總是各種各樣的令人匪夷所思的腦洞大開的互動方式:

ios 設定控制器背景半透明_iOS Modal出半透明控制器

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的互動方式有了比較深入的了解,以後碰到此類問題,可以快速的選擇合适的方式去搞定各種各樣的需求。