ios橫豎屏切換是一個很糾結的問題,之前項目中用到了,花了長時間查閱資料以及研究,才找到了一個相對靠譜的解決方案,該方案可以處理ios9系統以上的螢幕翻轉,至于ios9一下的系統,還沒有測試過。
為了過程的講解,我先給出一個應用的需求:整個界面就顯示一個按鈕,當點選這個按鈕的時候,界面能從豎屏切換到橫屏,當再次點選的時候,又能從橫屏切換到豎屏,之後點選循環往複。為了達到這樣的需求,我們首先建立一個ios工程。
在工程建立之後,需要設定應用支援的螢幕旋轉方向。預設情況下,ios支援四個方向的旋轉,即portrait、upsidedown、landscapeleft、landscaperight。
可以在工程配置的general下面可以看到,也可以在info.plist裡面進行配置

info.plist
配置好應用支援的螢幕旋轉類型之後,接下來就需要在代碼中配置橫豎屏的情況。
這裡很關鍵的一點是一定要配置rootviewcontroller的橫豎屏情況,特别是當rootviewcontroller是navigationviewcontroller的時候,是以一定要對作為rootviewcontroller的controller進行重寫。下面給出的代碼是對navigationviewcontroller的重寫。
重寫實作navigationviewcontroller的shouldautorate和supportedinterfaceorientations這兩個關鍵的方法,網上大部分建議都是讓shouldautorate傳回no,但實際上,傳回no的話,則會導緻同一個界面的不能進行翻轉,是以這裡還是需要傳回yes的。需要注意的是,interfaceorientationmask和interfaceorientation的初始值需要在controller初始化的時候進行指派的,取值按照應用剛啟動的時候螢幕翻轉方向來設定。
之後,将這個navigationviewcontroller作為應用啟動的rootviewcontroller,在appdelegate中的調用如下:
其中,viewcontroller是要顯示的第一個界面,其内容的代碼如下:
這個界面很簡單,就一個按鈕,每當點選的時候,設定一下rotatenavigationcontroller的兩個參數的值,并且切換一下螢幕的方向,同時,再重新整理一下。這裡的關鍵的方法是:
這個方法能改變裝置實際的旋轉方向。
完成以上的幾塊内容,實際上就可以控制螢幕的橫豎屏切換了。