當(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ì)。