iOS開(kāi)發(fā)中屏幕旋轉(zhuǎn)的那些坑

前言

隨著蘋(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)按照以下步驟操作:

  1. 監(jiān)聽(tīng)UIDeviceOrientationDidChangeNotification通知。
  2. 在監(jiān)聽(tīng)回調(diào)方法中NSLog打印通知信息陡叠。
  3. 啟動(dòng)應(yīng)用玩郊,看看控制臺(tái)的輸出信息。
  4. 不要旋轉(zhuǎn)屏幕枉阵,讓?xiě)?yīng)用退到后臺(tái)(command + shift + H)译红,然后看控制臺(tái)的輸出信息。
  5. 然后再啟動(dòng)應(yīng)用岭妖,看控制臺(tái)的輸出結(jié)果临庇。

以下是我的控制臺(tái)3次操作的輸出信息:

啟動(dòng):

output_info_1.png

退到后臺(tái):

output_info_2.png

回到前臺(tái):

output_info_3.png

可以看到雖然這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ō)淳蔼,UIDeviceOrientationUIInterfaceOrientation很容易搞混侧蘸,那這個(gè)兩個(gè)有什么不同。

  1. UIDeviceOrientation是指設(shè)備方向鹉梨,UIInterfaceOrientation是指用戶界面讳癌。一個(gè)是指硬件,一個(gè)是指軟件存皂。

  2. UIDeviceOrientation定義在<UIKit/UIDevice.h>中,而UIInterfaceOrientation定義在<UIKit/UIApplication.h>中晌坤。

  3. UIDeviceOrientation有7個(gè)枚舉可選值,通常只使用后6個(gè)旦袋。如下:

    UIDeviceOrientationUnknown,

    UIDeviceOrientationPortrait,

    UIDeviceOrientationPortraitUpsideDown,

    UIDeviceOrientationLandscapeLeft,

    UIDeviceOrientationLandscapeRight,

    UIDeviceOrientationFaceUp,

    UIDeviceOrientationFaceDown

UIInterfaceOrientation只有5個(gè)枚舉可選值,通常也只用后4個(gè)骤菠。

enum.png

所以兩者的關(guān)系可以總結(jié)如下:

1.UIDeviceOrientation改變時(shí),UIInterfaceOrientation不一定改變疤孕。

其中包括設(shè)備旋轉(zhuǎn)屏幕朝上(UIDeviceOrientationFaceUp)商乎、朝下(UIDeviceOrientationFaceDown)和用戶禁止了界面旋轉(zhuǎn)兩種情況。

configuration.png

在項(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)UIApplicationWillChangeStatusBarOrientationNotificationUIApplicationDidChangeStatusBarOrientationNotification這兩個(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)沸毁。

備注

測(cè)試代碼下載地址

本文系博主原創(chuàng)文章峰髓,歡迎轉(zhuǎn)載,但請(qǐng)標(biāo)注文章來(lái)源息尺。
文中若有晦澀之處携兵,歡迎評(píng)論指正。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末掷倔,一起剝皮案震驚了整個(gè)濱河市眉孩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌勒葱,老刑警劉巖浪汪,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異凛虽,居然都是意外死亡死遭,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門(mén)凯旋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)呀潭,“玉大人,你說(shuō)我怎么就攤上這事至非∧剖穑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵荒椭,是天一觀的道長(zhǎng)谐鼎。 經(jīng)常有香客問(wèn)我,道長(zhǎng)趣惠,這世上最難降的妖魔是什么狸棍? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮味悄,結(jié)果婚禮上草戈,老公的妹妹穿的比我還像新娘。我一直安慰自己侍瑟,他們只是感情好唐片,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著涨颜,像睡著了一般费韭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上咐低,一...
    開(kāi)封第一講書(shū)人閱讀 49,730評(píng)論 1 289
  • 那天揽思,我揣著相機(jī)與錄音,去河邊找鬼见擦。 笑死钉汗,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的鲤屡。 我是一名探鬼主播损痰,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼酒来!你這毒婦竟也來(lái)了卢未?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎辽社,沒(méi)想到半個(gè)月后伟墙,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡滴铅,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年戳葵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片汉匙。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拱烁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出噩翠,到底是詐尸還是另有隱情戏自,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布伤锚,位于F島的核電站擅笔,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏见芹。R本人自食惡果不足惜剂娄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望玄呛。 院中可真熱鬧阅懦,春花似錦、人聲如沸徘铝。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)惕它。三九已至怕午,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間淹魄,已是汗流浹背郁惜。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留甲锡,地道東北人兆蕉。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像缤沦,于是被迫代替她去往敵國(guó)和親虎韵。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 1.監(jiān)聽(tīng)屏幕旋轉(zhuǎn)方向 在處理iOS橫豎屏?xí)r缸废,經(jīng)常會(huì)和UIDeviceOrientation包蓝、UIInterface...
    彬至睢陽(yáng)閱讀 2,523評(píng)論 1 6
  • [這是第11篇] 導(dǎo)語(yǔ): iOS App中大多數(shù)頁(yè)面是只展示豎屏下的效果驶社,但是少部分頁(yè)面需要支持橫豎屏。本文分別介...
    南華coder閱讀 14,477評(píng)論 18 93
  • 前段時(shí)間抽空總結(jié)了一下iOS視頻播放的基本用法测萎,發(fā)現(xiàn)這其中還有一個(gè)我們無(wú)法繞過(guò)的問(wèn)題亡电,那就是播放界面的旋轉(zhuǎn)與適配。...
    梧雨北辰閱讀 31,034評(píng)論 14 147
  • 說(shuō)起來(lái)真是慚愧呢绳泉,明明是一個(gè)超級(jí)基本的問(wèn)題逊抡,但是我竟然現(xiàn)在才嘗試去接觸它姆泻,因?yàn)橹白龅膸讉€(gè)app零酪,都是不支持屏幕旋...
    賣(mài)萌涼閱讀 2,456評(píng)論 0 6
  • 藥師經(jīng)1普門(mén)品1大悲咒21心經(jīng)21六字大明咒隨時(shí)唱誦
    青島道平閱讀 159評(píng)論 0 0