最近在做一個模仿iOS11 Music的項目幔嫂,其中一個播放器頁面是這個樣子的跪楞。
沒錯,他的頂部露出了一塊前一個頁面一部分堡赔。
我們都知道识脆,默認(rèn)的present方式展現(xiàn)的新頁面,是看不到上一個頁面的內(nèi)容的善已,即便是將controller的view透明灼捂,也只能看到黑色的背景。蘋果應(yīng)該是出于降低內(nèi)存的考慮换团,當(dāng)一個新的頁面被present或push出來后悉稠,就將之前的頁面移除了。
要實現(xiàn)這個功能艘包,我首先想到的是把上一個頁面截圖的猛,然后放在present出來的頁面的底下。想虎。卦尊。腦洞也是夠大的。其實蘋果早就為我們準(zhǔn)備了一個屬性:modalPresentationStyle舌厨,使用他岂却,就能控制是否隱藏前一個頁面。(接下來我們統(tǒng)一把前一個頁面稱為presenting VC, 把后一個頁面稱為presented VC)
modalPresentationStyle這個屬性的可選值非常多:
fullScreen:(默認(rèn))代表彈出VC時淌友,presented VC充滿全屏煌恢,如果彈出VC的wantsFullScreenLayout設(shè)置為YES的,則會填充到狀態(tài)欄下邊震庭,否則不會填充到狀態(tài)欄之下瑰抵。
pageSheet:代表彈出是彈出VC時,presented VC的高度和當(dāng)前屏幕高度相同器联,寬度和豎屏模式下屏幕寬度相同二汛,剩余未覆蓋區(qū)域?qū)儼挡⒆柚褂脩酎c擊,這種彈出模式下拨拓,豎屏?xí)rUIModalPresentationFullScreen的效果一樣肴颊,橫屏?xí)r候兩邊則會留下變暗的區(qū)。
就算自己把這個圖做出來了渣磷,還是想不明白具體是什么樣子的婿着,好在設(shè)置Wi-Fi里被我揪出了一列
系統(tǒng)設(shè)置的Wi-Fi密碼界面,豎屏是全屏展示醋界,橫屏的話就會變成一個正方形竟宋,這個大小應(yīng)該是系統(tǒng)控制的。類似的頁面應(yīng)該ipad上會更多形纺。
formSheet:這種模式下丘侠,presented VC的高度和寬度均會小于屏幕尺寸,presented VC居中顯示逐样,四周留下變暗區(qū)域蜗字。如果設(shè)備處于橫向并且鍵盤可見,則視圖的位置向上調(diào)整脂新,以使視圖保持可見挪捕。(是不是很熟悉,我們的alert就是這種方式呈現(xiàn)的)
currentContext:這種模式下争便,presented VC的彈出方式和presenting VC的父VC的方式相同级零。
custom:自定義模式。這個模式可以最大化自定義專場的方式始花,需要實現(xiàn)UIViewControllerTransitioningDelegate代理妄讯。
overFullScreen:(新)簡單說就是不隱藏presenting VC,用于presented VC的view有透明的情況使用酷宵。那么這個和之前的有什么區(qū)別呢亥贸,區(qū)別主要在亮點:1.背景不會變深色(但還是會屏蔽觸控)2.presented VC view的大小和presenting VC一樣大時(即完全遮擋),前面幾個選項會直接隱藏presenting VC浇垦,而overFullScreen不考慮遮擋問題炕置,無條件顯示presenting VC。這就對presented VC大小和presenting VC一樣大但有透明的情況適用。
overCurrentContext:(新)這個模式也能達(dá)到overFullScreen的效果朴摊,不同的是它會把跟控制器(tabbar)覆蓋到presented VC上面(讀了API還是搞不清是啥意思默垄。。甚纲。)
popover:一種類似于Mac上全局字典的彈出方式口锭,帶有一個箭頭,在iphone上顯示的是全屏效果介杆,只有在大屏幕上才顯示popover效果鹃操。
好了,研究了這么多春哨,我們到底應(yīng)該選擇哪一個呢荆隘。起初我認(rèn)為formSheet比較合適,因為他默認(rèn)實現(xiàn)了背景變暗的效果(Music里也有這個效果)赴背。但使用之后發(fā)現(xiàn)始終無法完成這個效果椰拒,要么presented VC的大小改變不了(storyboard),要么presenting VC是黑色凰荚。后來我想了一下燃观,這個formSheet起初設(shè)計的場景,就是alert這種彈出框的效果浇揩,所以它默認(rèn)是居中的仪壮。如果要使用formSheet憨颠,還要控制view的位置胳徽,不太合理。而且storyboard中vc的view是無法改變大小的爽彤,因此只能使用overFullScreen模式养盗,將presented VC的透明度設(shè)為0,然后再鋪一個View上去适篙。
最后使用的時候有幾個注意點往核。首先在早期modalPresentationStyle的屬性是賦給presenting VC的,但后來都統(tǒng)一賦給presented VC嚷节,這個邏輯也很正確聂儒,這種需求往往是跟著presented VC走的。
其次是硫痰,modalPresentationStyle賦值的時機很重要衩婚,要在present事件之前賦值。因此不要在viewDidLoad里面修改modalPresentationStyle效斑,而在初始化方法里修改非春。storyboard則要在required init?(coder aDecoder: NSCoder)中修改。