前段时间项目中出现一个十分诡异的bug,打电话、分享热点开启之后,再打开APP,然后关闭电话或热点,APP导航条上端有20像素的黑条产生,具体表现如下:
经查找资料调试发现,状态栏标准高度为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确实比较难发现,不过还是有可能会出现的,出现之后确实很影响用户体验。