iOS學習筆記(3)— 旋轉螢幕

來源:互聯網
上載者:User

標籤:

 

iOS學習筆記(3)— 旋轉螢幕

一、旋轉螢幕機制: 

  iOS通過加速計判斷當前的裝置方向和旋轉螢幕。當加速計檢測到方向變化的時候,旋轉螢幕的流程如下:

  1、裝置旋轉時,系統接收到旋轉事件。

  2、系統將旋轉事件通過AppDelegate通知當前的主Window。

  3、window通知它的rootViewController。

    4、rootViewController判斷所支援的旋轉方向,完成旋轉。

  iOS系統中旋轉螢幕事件沒有像觸碰事件那樣進行hitTest,所以只有rootViewController才能接收到旋轉螢幕的事件,在其他viewController中實現旋轉控制方法是不會被調用的。當旋轉螢幕時應用程式會發出UIDeviceOrientationDidChangeNotification通知,這樣任何關係方向變化的view都可以通過註冊該通知,在裝置方向發生變化的時候發生響應。

 

 

  在響應裝置旋轉時,我們可以通過UIViewController的方法實現更細粒度的控制,當view controller接收到window傳來的方向變化的時候,流程如下:

 

  1、首先判斷當前viewController是否支援旋轉到目標方向,如果支援則繼續,否則流程就此結束。

 

  2、調用 willRotateToInterfaceOrientation:duration: 方法,通知view controller將要旋轉到目標方向。如果該viewController是一個container view controller的話,它會繼續調用其content view controller的該方法。這個時候我們也可以暫時將一些view隱藏掉,等旋轉結束以後在現實出來。

 

  3、window調整顯示的view controller的bounds,由於view controller的bounds發生變化,將會觸發 viewWillLayoutSubviews 方法。這個時候interfaceOrientation和statusBarOrientation方向還是原來的方向。

 

  4、接著當前view controller的 willAnimateRotationToInterfaceOrientation:duration: 方法將會被調用。系統將會把該方法中執行的所有屬性變化放到animation block中。

 

  5、執行旋轉螢幕動畫。

 

  6、最後調用 didRotateFromInterfaceOrientation: 方法,通知view controller旋轉動畫執行完畢。這個時候我們可以將第二部隱藏的view再顯示出來。

 

  整個響應過程如所示:

 

 

  

 

  以上就是UIKit下一個完整的旋轉螢幕流程,我們只需要按照提示做出相應的處理就可以完美的支援旋轉螢幕。

二、旋轉機制實現

 

 

  iOS5旋轉螢幕控制

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation{    return YES;}

  返回YES就是允許旋轉,NO就是不允許

  根據toInterfaceOrientation 可以控制螢幕允許旋轉的方向,比如不支援Home按鈕朝上這種螢幕方向。代碼如下:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation{   if (toInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)    {        return NO;    }    return YES;}

  

  這種方法已經被蘋果列為deprecated。但為了相容iOS5及以前的版本還需要繼續實現。

 

  iOS6旋轉螢幕控制

  - (BOOL)shouldAutorotate  預設返回YES,當為YES時允許轉屏,否則為不允許。

  - (NSUInteger)supportedInterfaceOrientations 決定可以轉哪個方向。如果所有方向都支援返回 UIInterfaceOrientationMaskAll,如果不允許Home鍵朝上返回UIInterfaceOrientationMaskAllButUpsideDown。

 

三、注意事項

  1、旋屏後的frame

  如果直接把window.rootviewController = (UIViewController*)vc;旋屏的時候vc的frame一直都是保持豎屏狀態,bounds是正確的。  如果使用UINavigationController的rootviewControoler 設定為vc,然後那NavigationControllerView去作為window的rootView,在旋屏的時候會發現vc的frame和bounds都是正確的。  結論:判斷螢幕尺寸用bounds比frame更準確。   2、如果viewController或者view是隱藏狀態的話就接收不到旋轉螢幕事件,那麼重新顯示就會有問題。可以通過 viewWillAppear 函數解決這個問題。  3、旋轉螢幕的時候,讓介面暫時不響應事件。  4、對於view層級比較複雜的視圖,使用替換當前的視圖,旋轉完成後再替換回原來的視圖。  5、旋轉後調用tableview的reload方法,保證螢幕尺寸變化後cell可以充滿全屏。

 

  

iOS學習筆記(3)— 旋轉螢幕

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.