美文网首页
有电话打入、开启热点、语音接入、录音开启等情况下,会出现,状态栏

有电话打入、开启热点、语音接入、录音开启等情况下,会出现,状态栏

作者: IThai | 来源:发表于2018-05-03 17:12 被阅读0次

当我们的APP正在使用的时候,突然有电话打入、开启热点、语音接入、录音开启等情况下,会出现,状态栏高度改变,界面下移的情况。如果我们没有做相关适配,那么有些界面会出现底部按钮遮挡、界面下移导致的部分数据遮挡等等情况。为了处理这种问题,下面提供一种解决思路,如有更好解决方案,万望指教。

UIApplicationWillChangeStatusBarFrameNotification 
这个通知,是监听状态栏改变的通知。通过该通知,可以获得状态栏改变的rect值。

知道了这些,我们就有了一个大致的方向。那么接下来就是如何方便快捷地解决界面下移导致的问题了。

如果项目开始前,我们就把这个情况考虑进去,那么最好的方案应该是,先写一个基类,然后把要做的操作尽量多的放入这个基类当中。
如果项目已经成形,相信你的VC也是有继承基类的吧。如果没有,你先去哭会吧。哭完了,可以开始加班了。还是去创建一个基类,然后一个一个的去使你的VC继承于他。即使你创建的这个基类现在只有这个解决界面下移的一个功能,以后也是有用的。好,不废话。

先说下主体思路,然后开始详细解释:
1.通过UIApplicationWillChangeStatusBarFrameNotification通知方法可以监听到状态栏的改变,并做处理。(其实我只是打印了状态栏的改变情况,并未在此处做什么处理。如果你有什么好的方法可以在这里统一处理,万望指点哪!)
2.由于项目中大量使用宏定义的屏幕高度导致替换不便。那么在需要的子控制器中添加方法 viewDidLayoutSubviews,就很有必要了:(-(void)viewDidLayoutSubviews//在某个类的内部调整子视图位置时,就会调用)。在该方法中,去修改要修改的控件的frame;

具体如下:

一:在BaseViewController中,监听并处理。(点击查看

1.viewDidload中添加监听,如下:
 /*
     ⚠️此处用的是 WillChange ,将要改变的状态监听。
     */
    //监听状态栏改变的通知 UIApplicationWillChangeStatusBarFrameNotification
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(layoutControllerSubViews:)
                                                 name:UIApplicationWillChangeStatusBarFrameNotification object:nil];
                                                 
2.#pragma mark  ===== 状态栏改变的通知  =====
-(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);
    /*
     因为是 WillChange,你会发现,self.view.height 会是改变前的。多比较打印和界面,就可以明白了。
     */
}
这里你会发现,self.view.frame.size.height的值是会跟随状态栏的改变而改变的。

二:通过viewDidLayoutSubviews方法修改需要处理的控件的frame。(点击查看)

#pragma mark  =====  viewDidLayoutSubviews  =====
-(void)viewDidLayoutSubviews//在某个类的内部调整子视图位置时,就会调用
{
    //刷新页面布局情况,解决打电话、开热点等,导致的状态栏高度改变引起界面下移情况
    
    //1.刷新当前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 的情况不考虑。为什么?自己测试下看看吧,这个机型状态栏高度不变化。
Demo

相关文章

网友评论

      本文标题:有电话打入、开启热点、语音接入、录音开启等情况下,会出现,状态栏

      本文链接:https://www.haomeiwen.com/subject/psrlrftx.html