有電話打入、開啟熱點(diǎn)、語音接入、錄音開啟等情況下,會(huì)出現(xiàn),狀態(tài)欄高度改變,界面下移的情況,解決方法。

當(dāng)我們的APP正在使用的時(shí)候,突然有電話打入、開啟熱點(diǎn)、語音接入、錄音開啟等情況下,會(huì)出現(xiàn),狀態(tài)欄高度改變,界面下移的情況。如果我們沒有做相關(guān)適配,那么有些界面會(huì)出現(xiàn)底部按鈕遮擋、界面下移導(dǎo)致的部分?jǐn)?shù)據(jù)遮擋等等情況。為了處理這種問題,下面提供一種解決思路,如有更好解決方案,萬望指教。

UIApplicationWillChangeStatusBarFrameNotification 
這個(gè)通知,是監(jiān)聽狀態(tài)欄改變的通知。通過該通知,可以獲得狀態(tài)欄改變的rect值。

知道了這些,我們就有了一個(gè)大致的方向。那么接下來就是如何方便快捷地解決界面下移導(dǎo)致的問題了。

如果項(xiàng)目開始前,我們就把這個(gè)情況考慮進(jìn)去,那么最好的方案應(yīng)該是,先寫一個(gè)基類,然后把要做的操作盡量多的放入這個(gè)基類當(dāng)中。
如果項(xiàng)目已經(jīng)成形,相信你的VC也是有繼承基類的吧。如果沒有,你先去哭會(huì)吧??尥炅?,可以開始加班了。還是去創(chuàng)建一個(gè)基類,然后一個(gè)一個(gè)的去使你的VC繼承于他。即使你創(chuàng)建的這個(gè)基類現(xiàn)在只有這個(gè)解決界面下移的一個(gè)功能,以后也是有用的。好,不廢話。

先說下主體思路,然后開始詳細(xì)解釋:
1.通過UIApplicationWillChangeStatusBarFrameNotification通知方法可以監(jiān)聽到狀態(tài)欄的改變,并做處理。(其實(shí)我只是打印了狀態(tài)欄的改變情況,并未在此處做什么處理。如果你有什么好的方法可以在這里統(tǒng)一處理,萬望指點(diǎn)哪!)
2.由于項(xiàng)目中大量使用宏定義的屏幕高度導(dǎo)致替換不便。那么在需要的子控制器中添加方法 viewDidLayoutSubviews,就很有必要了:(-(void)viewDidLayoutSubviews//在某個(gè)類的內(nèi)部調(diào)整子視圖位置時(shí),就會(huì)調(diào)用)。在該方法中,去修改要修改的控件的frame;

具體如下:

一:在BaseViewController中,監(jiān)聽并處理。(點(diǎn)擊查看

1.viewDidload中添加監(jiān)聽,如下:
 /*
     ??此處用的是 WillChange ,將要改變的狀態(tài)監(jiān)聽。
     */
    //監(jiān)聽狀態(tài)欄改變的通知 UIApplicationWillChangeStatusBarFrameNotification
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(layoutControllerSubViews:)
                                                 name:UIApplicationWillChangeStatusBarFrameNotification object:nil];
                                                 
2.#pragma mark  ===== 狀態(tài)欄改變的通知  =====
-(void)layoutControllerSubViews:(NSNotification *)notification
{
    NSValue *statusBarFrameValue =
    [notification.userInfo valueForKey:UIApplicationStatusBarFrameUserInfoKey];
    NSLog(@"statusBarFrameValue =====  %@",statusBarFrameValue);
    //
    CGRect rect;
    [statusBarFrameValue getValue:&rect];
    
    NSLog(@"statusBarFrameValue =====  %@,rect.Height  ===  %f,self.view.height === %f",statusBarFrameValue,rect.size.height,self.view.frame.size.height);
    /*
     因?yàn)槭?WillChange,你會(huì)發(fā)現(xiàn),self.view.height 會(huì)是改變前的。多比較打印和界面,就可以明白了。
     */
}
這里你會(huì)發(fā)現(xiàn),self.view.frame.size.height的值是會(huì)跟隨狀態(tài)欄的改變而改變的。

二:通過viewDidLayoutSubviews方法修改需要處理的控件的frame。(點(diǎn)擊查看)

#pragma mark  =====  viewDidLayoutSubviews  =====
-(void)viewDidLayoutSubviews//在某個(gè)類的內(nèi)部調(diào)整子視圖位置時(shí),就會(huì)調(diào)用
{
    //刷新頁面布局情況,解決打電話、開熱點(diǎn)等,導(dǎo)致的狀態(tài)欄高度改變引起界面下移情況
    
    //1.刷新當(dāng)前VC中tableview的布局
    CGFloat h = self.tabBarController.tabBar.frame.size.height;
    _tableView.frame = CGRectMake(0, SafeAreaTopHeight, SCREEN_WIDTH, self.view.frame.size.height - SafeAreaTopHeight - SafeAreaBottomHeight - - h - _footerView.frame.size.height);
    //2.刷新footerView的布局
    CGFloat tabBarH = self.tabBarController.tabBar.frame.size.height;
    [UIView animateWithDuration:0.4 animations:^{
        _footerView.frame = CGRectMake(10, self.view.frame.size.height - tabBarH - 55, SCREEN_WIDTH - 20, 50);
    }];
}

IPhoneX 的情況不考慮。為什么?自己測(cè)試下看看吧,這個(gè)機(jī)型狀態(tài)欄高度不變化。
Demo

最后編輯于
?著作權(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)容

  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 30,243評(píng)論 8 265
  • 錯(cuò)誤原因如圖(圖1)所示: 方法一:由于這類的崩潰信息通常難以重現(xiàn), 沒有任何的重現(xiàn)步驟,所以我們得找到發(fā)布該版本...
    Idoahc閱讀 1,465評(píng)論 0 2
  • 黎明,窗外沙沙的雨聲 讓我更留戀被窩的溫暖 真是好雨知時(shí)節(jié)…… 因?yàn)橛晏?,行?dòng)也匆忙起來 路邊各色的雨衣來回穿行 ...
    林曉789閱讀 108評(píng)論 4 2
  • 我想發(fā)明一臺(tái)機(jī)器人,讓外婆減少負(fù)擔(dān),讓我每天不那么孤單。 這臺(tái)機(jī)器人和狗狗的大小差不多,外形也和狗狗差不多,背...
    涼涼的夏天閱讀 196評(píng)論 1 2
  • 印象筆記中明確寫著今天距離2月26日已經(jīng)128天不飲酒了,但是今天我心中莫名產(chǎn)生要飲酒的想法。其實(shí)這種感覺跟吃藥很...
    綠茵少年閱讀 432評(píng)論 0 1

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