1. 程式人生 > >iOS 螢幕旋轉 及注意事項

iOS 螢幕旋轉 及注意事項

一、螢幕旋轉機制: 

  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 方法。這個時候interfaceOrientationstatusBarOrientation方向還是原來的方向。

  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 螢幕旋轉 注意事項

一、螢幕旋轉機制:    iOS通過加速計判斷當前的裝置方向和螢幕旋轉。當加速計檢測到方向變化的時候,螢幕旋轉的流程如下:   1、裝置旋轉時,系統接收到旋轉事件。   2、系統將旋轉事件通過AppDelegate通知當前的主Window。   3、window通

iOS啟動頁尺寸注意事項

執行環境:Xcode 7.2                    OS X 10.11 1、點選LauchImage,在右側選擇需要支援的裝置及支援的螢幕方向 2、點選圖片的位

Android 常見解析度(mdpi、hdpi 、xhdpi、xxhdpi )螢幕適配注意事項

1 Android手機目前常見的解析度 1.1 手機常見解析度: 4:3 VGA     640*480 (Video Graphics Array) QVGA  320*240 (Quarter VGA) HVGA  480*320 (Half-size VGA)

iOS應用內購常見問題注意事項

如果您在實現和測試iOS應用內購的時候遇到問題,可以逐一對照下面所列出的條目,並逐一進行檢查。相信可以排除大部分的錯誤。   1.您是否在iOS Dev Center中打開了對應應用AppID的In-App Purchases功能?登陸iOS Dev Center的Cert

iOS 299美元企業賬號申請流程注意事項

iOS開發者眾多,但並不是所有的開發者都對賬號申請,證書配置這些問題都清楚,畢竟不是所有開發者都能夠經歷這個環節,多數情況下是進公司之前這些東西都已經有了。 作為一個合格的iOS開發者,我們必須要了解蘋果的三種開發者賬號,下圖對三者進行了比較和總結,我在圖中需

IOS addChildViewController方法使用注意事項

在iOS 5.0及以後,iOS為UIViewController類添加了新的屬性和方法:123456@property(nonatomic,readonly) NSArray *childViewControllers- (void)addChildViewControlle

iOS中使用dispatch_once實現單例注意事項

單例模式,是一種常用的軟體設計模式。在它的核心結構中只包含一個被稱為單例的特殊類。通過單例模式可以保證系統中,應用該模式的類一個類只有一個例項。即一個類只有一個物件例項。 在iOS中單例模式實現方式是在類中編寫名為sharedInstance的方法,該方法只會返回全類共

【VUE】git命令列程式碼提交流程注意事項

本篇為我在提交程式碼的過程中使用過的命令 僅做記錄參考 git命令還有很多 其他功能 可自行百度 命令git add (1)git add . 提交全部修改檔案 (2)git add +檔名 提交單個檔案 命令 git commit -m '描述’ eg: git commi

重灌系統後,重新安裝ORACLE加環境變數配置、客戶端PL/SQL的安裝過程,注意事項(避免再次踩坑)

(1)首先了解什麼是OERACLE及Oracle與PL/SQL是什麼關係: ORACLE是資料庫,有客戶端和伺服器; PLSQL Developer只是第三方工具,服務於ORACLE,類似的工具還有Toad,sqlplus,sql developer等等; 安裝PLSQL Developer

【C++】向量(vector) 基本使用方法注意事項

介紹: 向量(Vector)是一個封裝了動態大小陣列的順序容器(Sequence Container)。跟任意其它型別容器一樣,它能夠存放各種型別的物件。可以簡單的認為,向量是一個能夠存放任意型別的動態陣列。 特點: 1.順序序列 順序容器中的元素按照嚴格的線性順序排序。可以通過元素

Windows下RabbitMQ安裝注意事項

Windows下RabbitMQ安裝及注意事項 簡介 背景 1.      RabbitMQ是一個由erlang開發的AMQP(Advanved Message Queue)的開源實現。 RabbitMQ是實現AMQP(高階訊息佇列協議)的訊

XV6環境搭建注意事項

Ubuntu16.04SLT 64位 工具鏈 sudo apt-get install gcc-multilib libsdl1.2-dev, libtool-bin, libglib2.0-dev, libz-dev, and libpixman-1-dev.     下載

仙人劍花怎麼養 仙人劍花的養殖方法注意事項

劍花也稱霸王花、七星劍花、龍骨花,為仙人掌科量天尺屬植物量天尺的花。夏、秋間採收淨花,縱向切開(基部相連),略蒸後,晒乾。量天尺又名:龍骨花(海南保亭),霸王鞭(海南三亞,廣東肇慶),三角柱、三稜箭(北京俗稱)。很多朋友不知道如何養殖仙人劍花,下面來介紹一下。 從生長環境溫度方面來說

阿里雲備案幕布申請郵寄注意事項

阿里雲備案需要幕布(貌似個別地區,例如魔都是不需要幕布的),阿里雲免費提供幕布,很多使用者不清楚阿里雲幕布去哪申請,阿里雲惠網分享阿里雲備案關於幕布相關問題: 一:阿里雲幕布長啥樣? 二:備案幕布申請: 阿里雲備案系統即可申請幕布,首先需要先完成備案初審,初審後登入 阿里雲備案系統,辦理網站

CSS變數實用指南注意事項

近年來,一些動態特性已經開始成為 CSS 語言本身的一部分。 CSS變數 – 官方的術語為 “自定義屬性” – 已經已經加入規範並且具有很好的瀏覽器支援,而 CSS mixins 目前正在開發中 。 在本文中,你將瞭解如何開始將CSS變數整合到CSS開發工作流程中,讓你的樣式表更好維護,且減少重複。 讓我

MySQL索引的使用注意事項

索引是儲存引擎用於快速找到記錄的一種資料結構。索引優化應該是對查詢效能優化最有效的手段了。索引能夠輕易將查詢效能提高几個數量級,"最優"的索引有時比一個"好的"索引效能要好兩個數量級。 索引可以包含一個(單列索引)或多個列(組合索引)的值。 想要使用組合索引首先要了解一個原則:最左字首原則。如果索引包含多

Git- .gitignore匹配規則注意事項

.gitignore檔案的匹配規則 Windows中可以通過echo 命令或者用Windows中的bash建立.gitignore檔案。其主要的匹配規則如下: *.a # 忽略所有 .a 結尾的檔案 !lib.a # 但 lib.a 除外 TODO # 僅僅

分享知識-快樂自己:Struts2(動態方法、動態結果、萬用字元、方法內部跳轉、action跳轉、OGNL 的使用注意事項

這裡主要以案例演示:涵蓋以下知識點 1、動態方法呼叫:使用關鍵 符號 ! 進行操作   例如:/名稱空間 ! 方法名 2、動態結果集:就是說,通過後臺返回的結果 ${} 獲取,重定向到符合預期的頁面。 3、萬能萬用字元:*_*  :第一個 * 為 類名、第二個 * 為方

elasticsearch(五)java 使用批量操作bulk注意事項

1,BulkRequest物件可以用來在一次請求中,執行多個索引、更新或刪除操作     且允許在一次請求中進行不同的操作,即一次請求中索引、更新、刪除操作可以同時存在 BulkRequest bulkRequest = new BulkRequest(); bulk

實戰Java高併發程式設計(四、鎖的優化注意事項

在多核時代,使用多執行緒可以明顯地提升系統的效能。但事實上,使用多執行緒會額外增加系統的開銷。對於單任務或單執行緒的應用來說,其主要資源消耗在任務本身。對於多執行緒來說,系統除了處理功能需求外,還需要維護多執行緒環境特有的資訊,如執行緒本身的元資料,執行緒的排程,執行緒上下文的切換等。 4.1有