iOS開發 | 熱點適配完美攻略
開始:
當手機熱點開啟並被其他裝置接入時,狀態列會比普通狀態下多20px,此時整個檢視控制器會被向下推20px,推出螢幕。如果不做相應處理必然會帶來糟糕的使用者體驗,如下,兩張對比圖(注意下方的tabBar):
這是優化前的效果;
這是優化後的效果;
那麼,針對這種特殊情況我們應該怎樣處理呢?
基本思路:
既然是狀態列的高度變化導致的,那就監聽狀態列高度的變化,每當狀態列高度發生變化就傳送一個通知,通知相應的頁面調整UI。
進一步思考
監聽狀態列高度變化可以用KVO或者RAC。如下
// 監聽狀態列的frame變化,如接入熱點時狀態列會增加20畫素
[RACObserve([UIApplication sharedApplication], statusBarFrame) subscribeNext:^(id x) {
if ([UIApplication sharedApplication].statusBarFrame.size.height > 20) {
// 狀態列高度大於20,傳送通知
}else{
}
}];
其實這樣做完全是多餘的,因為每當狀態列高度發生變化時系統都會發送通知:UIApplicationWillChangeStatusBarFrameNotification與UIApplicationDidChangeStatusBarFrameNotification,我們監聽這兩個通知中的一個即可。
在哪裡監聽狀態列高度改變的通知?
在需要調整UI的地方監聽。因為狀態列高度一變可以說所有的頁面都受到了影響,所以可以在基類BaseViewController(其他檢視控制器都繼承於這個類)裡面接收通知(viewDidLoad方法裡):
// 接收狀態列高度發生變化的通知
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(adjustStatusBar) name:@"UIApplicationDidChangeStatusBarFrameNotification" object:nil ];
接收到通知後執行調整UI的方法,這個方法需要在BaseViewController的子類里根據實際情況進行重寫,例如調整tableView的高度。
// 熱點被接入,子類重寫
- (void)adjustStatusBar{
}
接收不到通知怎麼辦?
方法都告訴你了,接下來你就慢慢新增程式碼了,雖然有點多有點痛苦,可以說每個頁面都要調整。類似於下面的這段程式碼幾乎在我所有的檢視控制器中都有:
#pragma mark - 接入熱點
- (void)adjustStatusBar{
if (STATUS_BAR_BIGGER_THAN_20) {
_shopTotalView.maxY = screenHeight - 69;
}else{
_shopTotalView.maxY = screenHeight - 49;
}
}
總結
熱點適配需注意兩點:
監聽狀態列高度改變的通知用來及時調整UI
接收不到通知的,在UI搭建完成後做相應調整
小技巧
基類接收通知,子類重寫方法
最後完整展示下優化後的效果:
如果是用自動佈局的話,搭建UI的時候如果考慮到這種情況的話,那麼就不需要再特殊處理這種情況了。這就是自動佈局的優勢。