一、項目問題
項目中經(jīng)常會遇到需要彈出一個半透明視圖的情況,先前自己想著用UIWindow做,后來發(fā)現(xiàn)因為界面控制器復雜不好管理,于是放棄,度娘了一下,發(fā)現(xiàn)直接用modal的方法就可實現(xiàn),簡單又明了。先上效果圖:
關鍵代碼如下:
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中模態(tài)顯示view controller B的時候,A就充當presenting view controller(彈出VC),而B就是presented view controller(被彈出VC)。官方文檔建議這兩者之間**通過delegate實現(xiàn)交互**,如果使用過UIImagePickerController 從系統(tǒng)相冊選取照片或者拍照,我們可以發(fā)現(xiàn)imagePickerController和彈出它的VC之間就是通過 UIImagePickerControllerDelegate實現(xiàn)交互的。因此我們在實際應用用,最好也遵守這個原則,在被彈出的VC中定義 delegate,然后在彈出VC中實現(xiàn)該代理,這樣就可以比較方便的實現(xiàn)兩者之間的交互。
2.Modal Presentation Styles(彈出風格)
通過設置presenting VC的modalPresentationStyle屬性,我們可以設置彈出View Controller時的風格,有以下四種風格,其定義如下:
typedef enum {
UIModalPresentationFullScreen = 0,
UIModalPresentationPageSheet,
UIModalPresentationFormSheet,
UIModalPresentationCurrentContext,
} UIModalPresentationStyle;
UIModalPresentationFullScreen代表彈出VC時,presented VC充滿全屏,如果彈出VC的wantsFullScreenLayout設置為YES的,則會填充到狀態(tài)欄下邊,否則不會填充到狀態(tài)欄之下。
UIModalPresentationPageSheet代表彈出是彈出VC時,presented VC的高度和當前屏幕高度相同,寬度和豎屏模式下屏幕寬度相同,剩余未覆蓋區(qū)域?qū)儼挡⒆柚褂脩酎c擊,這種彈出模式下,豎屏時跟 UIModalPresentationFullScreen的效果一樣,橫屏時候兩邊則會留下變暗的區(qū)域。
UIModalPresentationFormSheet這種模式下,presented VC的高度和寬度均會小于屏幕尺寸,presented VC居中顯示,四周留下變暗區(qū)域。
UIModalPresentationCurrentContext這種模式下,presented VC的彈出方式和presenting VC的父VC的方式相同。
這四種方式在iPad上面統(tǒng)統(tǒng)有效,但在iPhone和iPod touch上面系統(tǒng)始終已UIModalPresentationFullScreen模式顯示presented VC。
3.Modal Transition Style(彈出時的動畫風格)
通過設置設置presenting VC的modalTransitionStyle屬性,我們可以設置彈出presented VC時場景切換動畫的風格,其定義如下:
typedef enum {
UIModalTransitionStyleCoverVertical = 0,
UIModalTransitionStyleFlipHorizontal,
UIModalTransitionStyleCrossDissolve,
UIModalTransitionStylePartialCurl,
} UIModalTransitionStyle;
我們可以看到有從底部滑入,水平翻轉(zhuǎn)進入,交叉溶解以及翻頁這四種風格可選。這四種風格在不受設備的限制,即不管是iPhone還是iPad都會根據(jù)我們指定的風格顯示轉(zhuǎn)場效果。
4.Dismiss Modal ViewController(消失彈出的VC)
誰來調(diào)用這消失presented VC的這個方法:正 確的做法是“誰污染誰治理”,即presenting VC調(diào)用上面的方法來取消presented VC的顯示。這樣做有一個好處,如果一個VC真不用戶做的不同選擇可能彈出不同的view controller,當不再需要顯示被彈出的view controller的時候,直接調(diào)用[self dismissModalViewControllerAnimated]即可使之消失,而不用去關心 其具體顯示的哪一類view controller。當然系統(tǒng)在這里做了優(yōu)化,當我們在presented VC里面調(diào)用上面的方法的時候,系統(tǒng)會自動的將這個消息傳遞到相應的presenting VC中,這樣就可以實現(xiàn)不管誰彈出了自己,當不再需要的時候直接將自己消失掉的功能。在應用中具體要采用那種要看具體情況,如果presented VC需要和presenting VC有數(shù)據(jù)傳遞的話,建議在presenting VC實現(xiàn)的代理函數(shù)中dismiss彈出的view controller。
引用連接: