iOS 打电话、分享热点状态栏变化引起的bug

时间:2022-11-09 10:04:28

前段时间项目中出现一个十分诡异的bug,打电话、分享热点开启之后,再打开APP,然后关闭电话或热点,APP导航条上端有20像素的黑条产生,具体表现如下:
iOS 打电话、分享热点状态栏变化引起的bug

经查找资料调试发现,状态栏标准高度为20,但是当打电话、分享热点时,状态栏的高度有20变为40,这时APP页面整体下压20。当打电话、分享热点结束时,状态栏高度变回20,本来页面应该上弹20的,但是我们的APP有一个抽屉,抽屉是主页的childViewController,这个childViewController没有弹回去,我们需要手动将其弹回。
我们可以监听状态栏高度变化的事件,该事件名称为:UIApplicationDidChangeStatusBarFrameNotification,在需要监听的地方,添加:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(layOutControllerViews) name:UIApplicationDidChangeStatusBarFrameNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkStatusBarNormal) name:@"enterForeground" object:nil];

并且监听进入APP之后状态栏高度的是否是标准的,如果是标准的,则不用做任何处理,如果不是标准的的,则需要将childViewController向上拉20个高度:

- (void)checkStatusBarNormal {
    CGRect statusBarFrame = [UIApplication sharedApplication].statusBarFrame;
    CGFloat statusBarHeight = statusBarFrame.size.height;
    if (statusBarHeight == 20.0) {
        self.isStatusBarNormal = YES;
    } else {
        self.isStatusBarNormal = NO;
    }
}

- (void)layOutControllerViews {
    CGRect mainFrame = _mainVc.view.frame;
    CGRect leftMenuFrame = self.view.frame;
    mainFrame.origin.y = 0;
    leftMenuFrame.origin.y = 0;
    leftMenuFrame.size.height = SCREEN_HEIGHT;
    if (!self.isStatusBarNormal) {
        mainFrame.size.height = SCREEN_HEIGHT;
    }
    _mainVc.view.frame = mainFrame;
    self.view.frame = leftMenuFrame;
}

另外,UIApplicationDidChangeStatusBarFrameNotification 还可以用作UI的自适应,当打电话、分享热点时,可能会把页面的整体布局打乱,所以应该根据状态栏的高度自适应调整UI布局。

最后测试发现,糗百、招商银行客户端都有这个问题,这个bug确实比较难发现,不过还是有可能会出现的,出现之后确实很影响用户体验。