iOS開發(fā) | 熱點(diǎn)適配完美攻略

iOS開發(fā) | 熱點(diǎn)適配完美攻略?

當(dāng)手機(jī)熱點(diǎn)開啟并被其他設(shè)備接入時(shí),狀態(tài)欄會(huì)比普通狀態(tài)下多20px,此時(shí)整個(gè)視圖控制器會(huì)被向下推20px,推出屏幕。如果不做相應(yīng)處理必然會(huì)帶來(lái)糟糕的用戶體驗(yàn),如下,兩張對(duì)比圖(注意下方的tabBar):

未做處理:

優(yōu)化前.jpg

做了處理:

優(yōu)化后.jpg

那么,針對(duì)這種特殊情況我們應(yīng)該怎樣處理呢?

基本思路:

既然是狀態(tài)欄的高度變化導(dǎo)致的,那就監(jiān)聽狀態(tài)欄高度的變化,每當(dāng)狀態(tài)欄高度發(fā)生變化就發(fā)送一個(gè)通知,通知相應(yīng)的頁(yè)面調(diào)整UI。

進(jìn)一步思考

監(jiān)聽狀態(tài)欄高度變化可以用KVO或者RAC。如下:

// 監(jiān)聽狀態(tài)欄的frame變化,如接入熱點(diǎn)時(shí)狀態(tài)欄會(huì)增加20像素[RACObserve([UIApplicationsharedApplication], statusBarFrame) subscribeNext:^(idx) {if([UIApplicationsharedApplication].statusBarFrame.size.height >20) {// 狀態(tài)欄高度大于20,發(fā)送通知}else{? ? ? ? }? ? }];

其實(shí)這樣做完全是多余的,因?yàn)槊慨?dāng)狀態(tài)欄高度發(fā)生變化時(shí)系統(tǒng)都會(huì)發(fā)送通知:UIApplicationWillChangeStatusBarFrameNotification與UIApplicationDidChangeStatusBarFrameNotification,我們監(jiān)聽這兩個(gè)通知中的一個(gè)即可。

在哪里監(jiān)聽狀態(tài)欄高度改變的通知?

在需要調(diào)整UI的地方監(jiān)聽。因?yàn)闋顟B(tài)欄高度一變可以說(shuō)所有的頁(yè)面都受到了影響,所以可以在基類BaseViewController(其他視圖控制器都繼承于這個(gè)類)里面接收通知(viewDidLoad方法里):

// 接收狀態(tài)欄高度發(fā)生變化的通知[[NSNotificationCenter defaultCenter]addObserver:selfselector:@selector(adjustStatusBar)name:@"UIApplicationDidChangeStatusBarFrameNotification"object:nil];

接收到通知后執(zhí)行調(diào)整UI的方法,這個(gè)方法需要在BaseViewController的子類里根據(jù)實(shí)際情況進(jìn)行重寫,例如調(diào)整tableView的高度。

// 熱點(diǎn)被接入,子類重寫- (void)adjustStatusBar{}

接收不到通知怎么辦???

通知只能發(fā)送給已經(jīng)存在的對(duì)象,還沒(méi)有初始化的對(duì)象是接收不到通知的。那么就是說(shuō)我們需要保存一下狀態(tài)欄的高度咯?其實(shí)不必,因?yàn)闋顟B(tài)欄的高度我們隨時(shí)可以獲?。?/p>

[UIApplication sharedApplication].statusBarFrame.size.height

為方便使用,可以在PCH文件里寫個(gè)宏定義:

// 狀態(tài)欄高度大于20(熱點(diǎn)被連接時(shí))#define STATUS_BAR_BIGGER_THAN_20 [UIApplication sharedApplication].statusBarFrame.size.height>20

你可以翻譯一下STATUS_BAR_BIGGER_THAN_20??

好了現(xiàn)在來(lái)說(shuō)未初始化的頁(yè)面怎么處理:

方法一:初始化的時(shí)候根據(jù)狀態(tài)欄高度搭建UI(趕緊重構(gòu)代碼呵呵噠)

方法二:不改變以前的代碼,在UI搭建完成后調(diào)用調(diào)整UI的方法(重寫的BaseViewController的那個(gè)方法)。

顯然方法二是簡(jiǎn)單切實(shí)可行的。

接下來(lái)怎么辦???

方法都告訴你了,接下來(lái)你就慢慢添加代碼了,雖然有點(diǎn)多有點(diǎn)痛苦,可以說(shuō)每個(gè)頁(yè)面都要調(diào)整。類似于下面的這段代碼幾乎在我所有的視圖控制器中都有:

#pragmamark - 接入熱點(diǎn)- (void)adjustStatusBar{if(STATUS_BAR_BIGGER_THAN_20) {_shopTotalView.maxY = screenHeight -69;? ? }else{_shopTotalView.maxY = screenHeight -49;? ? }}

總結(jié)

熱點(diǎn)適配需注意兩點(diǎn):

監(jiān)聽狀態(tài)欄高度改變的通知用來(lái)及時(shí)調(diào)整UI

接收不到通知的,在UI搭建完成后做相應(yīng)調(diào)整

小技巧

基類接收通知,子類重寫方法

最后完整展示下優(yōu)化后的效果:

完整展示.gif

如果是用自動(dòng)布局的話,搭建UI的時(shí)候如果考慮到這種情況的話,那么就不需要再特殊處理這種情況了。這就是自動(dòng)布局的優(yōu)勢(shì)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 文章出處:http://www.itdecent.cn/p/a3f31cb9a8a3?utm_campaign=h...
    edison0428閱讀 1,131評(píng)論 0 2
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,039評(píng)論 25 709
  • 1、去除頁(yè)眉的橫線方法兩則 在頁(yè)眉插入信息的時(shí)候經(jīng)常會(huì)在下面出現(xiàn)一條橫線,如果這條橫線影響你的視覺,這時(shí)你可以采用...
    南屋阿米佛頭閱讀 4,742評(píng)論 4 37
  • 今天看到很多正能量,都是在講可以治愈的,不管怎樣我首先就是擺正心態(tài),趁機(jī)好好休息,不管怎么樣肯定是有幫助的,現(xiàn)在就...
    妮妮欣兒閱讀 193評(píng)論 0 0
  • 歲月, 匆匆而過(guò), 數(shù)不盡的滄海桑田。 縱時(shí)光悠悠, 北風(fēng)呼嘯, 無(wú)濟(jì)于事, 隨風(fēng)而去。
    冷靈璃閱讀 406評(píng)論 0 0

友情鏈接更多精彩內(nèi)容