前言
隨著蘋(píng)果設(shè)備更新?lián)Q代過(guò)程中,設(shè)備的屏幕尺寸也越做越大,設(shè)備上的應(yīng)用可以自由旋轉(zhuǎn)也被越來(lái)越重視玖详。
如果iPad上的一個(gè)應(yīng)用不能旋轉(zhuǎn),那么這必然將會(huì)為用戶體驗(yàn)減分勤讽。
因此出現(xiàn)了AutoLayout
技術(shù)和Masonry
等其他一系列適配旋轉(zhuǎn)的第三方庫(kù)蟋座,旨在提升良好的用戶體驗(yàn)。
當(dāng)然今天說(shuō)的不是自動(dòng)布局問(wèn)題脚牍,而是設(shè)備的旋轉(zhuǎn)問(wèn)題向臀。
首先,請(qǐng)問(wèn)大家監(jiān)聽(tīng)屏幕旋轉(zhuǎn)的時(shí)候诸狭,都監(jiān)聽(tīng)的是哪個(gè)通知券膀?
很多人都會(huì)用到UIDeviceOrientationDidChangeNotification
這個(gè)通知,顧名思義驯遇,這個(gè)通知字面意思就是設(shè)備旋轉(zhuǎn)改變通知芹彬。
是的,我們就聊一下這個(gè)通知的坑叉庐。
1.神奇的通知
為什么說(shuō)UIDeviceOrientationDidChangeNotification
這個(gè)通知是神奇的舒帮?
請(qǐng)按照以下步驟操作:
- 監(jiān)聽(tīng)
UIDeviceOrientationDidChangeNotification
通知。 - 在監(jiān)聽(tīng)回調(diào)方法中NSLog打印通知信息陡叠。
- 啟動(dòng)應(yīng)用玩郊,看看控制臺(tái)的輸出信息。
- 不要旋轉(zhuǎn)屏幕枉阵,讓?xiě)?yīng)用退到后臺(tái)(command + shift + H)译红,然后看控制臺(tái)的輸出信息。
- 然后再啟動(dòng)應(yīng)用岭妖,看控制臺(tái)的輸出結(jié)果临庇。
以下是我的控制臺(tái)3次操作的輸出信息:
啟動(dòng):
退到后臺(tái):
回到前臺(tái):
可以看到雖然這3次操作中都沒(méi)有進(jìn)行旋轉(zhuǎn)操作,但是都接收到了系統(tǒng)發(fā)出的旋轉(zhuǎn)通知昵慌。
如果你在監(jiān)聽(tīng)的方法中進(jìn)行了消耗資源的響應(yīng)動(dòng)作或者進(jìn)行了頁(yè)面重新布局,那么這樣的話就白白浪費(fèi)了CPU時(shí)間淮蜈,甚至?xí)鲥e(cuò)斋攀。
2.UIDeviceOrientation & UIInterfaceOrientation
在說(shuō)UIDeviceOrientationDidChangeNotification
通知之前,我們先看兩個(gè)枚舉類(lèi)型梧田。
對(duì)于初學(xué)者來(lái)說(shuō)淳蔼,UIDeviceOrientation
和UIInterfaceOrientation
很容易搞混侧蘸,那這個(gè)兩個(gè)有什么不同。
UIDeviceOrientation
是指設(shè)備方向鹉梨,UIInterfaceOrientation
是指用戶界面讳癌。一個(gè)是指硬件,一個(gè)是指軟件存皂。UIDeviceOrientation
定義在<UIKit/UIDevice.h>
中,而UIInterfaceOrientation
定義在<UIKit/UIApplication.h>
中晌坤。-
UIDeviceOrientation
有7個(gè)枚舉可選值,通常只使用后6個(gè)旦袋。如下:UIDeviceOrientationUnknown,
UIDeviceOrientationPortrait,
UIDeviceOrientationPortraitUpsideDown,
UIDeviceOrientationLandscapeLeft,
UIDeviceOrientationLandscapeRight,
UIDeviceOrientationFaceUp,
UIDeviceOrientationFaceDown
而UIInterfaceOrientation
只有5個(gè)枚舉可選值,通常也只用后4個(gè)骤菠。
所以兩者的關(guān)系可以總結(jié)如下:
1.UIDeviceOrientation改變時(shí),UIInterfaceOrientation不一定改變疤孕。
其中包括設(shè)備旋轉(zhuǎn)屏幕朝上(UIDeviceOrientationFaceUp)商乎、朝下(UIDeviceOrientationFaceDown)和用戶禁止了界面旋轉(zhuǎn)兩種情況。
在項(xiàng)目工程中可以配置允許旋轉(zhuǎn)的方向祭阀。
2. UIInterfaceOrientation
旋轉(zhuǎn)觸發(fā)時(shí)鹉戚,UIDeviceOrientation
一定改變。因?yàn)橛脩艚缑媸歉鶕?jù)設(shè)備方向來(lái)改變的专控。
2.監(jiān)聽(tīng)屏幕旋轉(zhuǎn)的正確姿勢(shì)
根據(jù)以上的總結(jié)內(nèi)容崩瓤,我們應(yīng)該去<UIKit/UIApplication.h>
中找看有沒(méi)有相關(guān)通知定義。
結(jié)果我們找到如下兩個(gè)方法踩官。
在不確定具體表示什么的時(shí)候却桶,最直接的是去查官方文檔。
1.UIApplicationWillChangeStatusBarOrientationNotification
Posted when the app is about to change the orientation of its interface.
釋義:當(dāng)用戶界面方向?qū)⒁淖儠r(shí)蔗牡,發(fā)出該通知颖系。
The userInfo dictionary contains an NSNumber that encapsulates a UIInterfaceOrientation value (see UIInterfaceOrientation). Use UIApplicationStatusBarOrientationUserInfoKey to access this value.
釋義:該通知的userInfo包含了屏幕方向的枚舉值,可以使用鍵UIApplicationStatusBarOrientationUserInfoKey
去字典中訪問(wèn)該值辩越。
2.UIApplicationDidChangeStatusBarOrientationNotification
Posted when the orientation of the app’s user interface changes.
釋義:當(dāng)用戶界面方向已經(jīng)改變了嘁扼,發(fā)出該通知。
The userInfo dictionary contains an NSNumber object that encapsulates a UIInterfaceOrientation value (see UIInterfaceOrientation). Use UIApplicationStatusBarOrientationUserInfoKey to access this value.
釋義:該通知的userInfo包含了屏幕方向的枚舉值黔攒,可以使用鍵UIApplicationStatusBarOrientationUserInfoKey
去字典中訪問(wèn)該值趁啸。
所以,監(jiān)聽(tīng)UIApplicationWillChangeStatusBarOrientationNotification
和UIApplicationDidChangeStatusBarOrientationNotification
這兩個(gè)通知才是正確的監(jiān)聽(tīng)屏幕旋轉(zhuǎn)的姿勢(shì)督惰。并且還可以得到界面改變之前的方向和改變之后的方向不傅。
3.總結(jié)
雖然我們知道了怎樣監(jiān)聽(tīng)屏幕的旋轉(zhuǎn),但是本著深究問(wèn)題的精神赏胚,對(duì)UIDeviceOrientationDidChangeNotification
這個(gè)通知做簡(jiǎn)要討論和猜測(cè)访娶。
1.UIDeviceOrientationRotateAnimatedUserInfoKey
從打印出的通知的信息字典可以看到,該值有時(shí)為1觉阅,有時(shí)為0崖疤。去網(wǎng)上查找資料秘车,發(fā)現(xiàn)幾乎沒(méi)有什么有用信息,官方文檔也沒(méi)任何說(shuō)明內(nèi)容劫哼。這可能是蘋(píng)果官方認(rèn)為我們根本無(wú)法用到這個(gè)鍵值叮趴。
從字面看,大概意思是指“方向旋轉(zhuǎn)動(dòng)畫(huà)”权烧,應(yīng)該是指旋轉(zhuǎn)中是否使用了過(guò)渡動(dòng)畫(huà)眯亦。哈哈??,不知道是不是這樣的豪嚎。
2.為什么在應(yīng)用進(jìn)入前臺(tái)和后臺(tái)的時(shí)候搔驼,系統(tǒng)都會(huì)發(fā)送這個(gè)通知?
我們知道侈询,當(dāng)應(yīng)用進(jìn)入后臺(tái)了舌涨,便會(huì)被系統(tǒng)自動(dòng)掛起,這時(shí)扔字,應(yīng)用的進(jìn)程處于休眠狀態(tài)囊嘉,此時(shí)的應(yīng)用是不會(huì)執(zhí)行任何操作的,直到應(yīng)用被重新喚醒或者被殺掉革为。
應(yīng)用處于后臺(tái)時(shí)扭粱,設(shè)備進(jìn)行了旋轉(zhuǎn),監(jiān)聽(tīng)設(shè)備旋轉(zhuǎn)的一些方法就沒(méi)法得到回調(diào)震檩,無(wú)法進(jìn)行相關(guān)操作琢蛤。當(dāng)重新喚起應(yīng)用時(shí),可能界面顯示的結(jié)果不是用戶期待的樣子抛虏,這樣就顯得不是很友好博其。
蘋(píng)果可能為了規(guī)避這一問(wèn)題,在應(yīng)用喚起的時(shí)候自動(dòng)發(fā)送該通知迂猴,即使休眠期間設(shè)備的方向沒(méi)有旋轉(zhuǎn)過(guò)慕淡,也讓?xiě)?yīng)用去響應(yīng)對(duì)應(yīng)的事件,這樣就可以提高用戶的體驗(yàn)沸毁。
備注
本文系博主原創(chuàng)文章峰髓,歡迎轉(zhuǎn)載,但請(qǐng)標(biāo)注文章來(lái)源息尺。
文中若有晦澀之處携兵,歡迎評(píng)論指正。