1. 程式人生 > >iOS開發 | 熱點適配完美攻略

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的時候如果考慮到這種情況的話,那麼就不需要再特殊處理這種情況了。這就是自動佈局的優勢。