在开发应用时,遇到了拨打电话及录制视频后,发现red statusbar一闪而过但是整体页面下移的问题,在stackoverflow上寻求无果。
通过调试Debug View Hierarchy发现
UIViewControllerWrapperView开始就有不同程度的下移,添加Observer之后发现:
2016-09-03 10:50:45.710 Cocoa[2471:1581789] CGRect–{{0, 0}, {320, 568}}
2016-09-03 10:50:59.294 Cocoa[2471:1581789] CGRect–{{0, 0}, {320, 548}}
2016-09-03 10:50:59.344 Cocoa[2471:1581789] CGRect–{{0, 20}, {320, 548}}
2016-09-03 10:50:59.435 Cocoa[2471:1581789] CGRect–{{0, 20}, {320, 568}}
2016-09-03 10:50:59.447 Cocoa[2471:1581789] CGRect–{{0, 0}, {320, 588}}
2016-09-03 10:50:59.910 Cocoa[2471:1581789] CGRect–{{0, 0}, {320, 588}}
可见在red statusbar出现并消失这一过程中,多出了
2016-09-03 10:50:59.435 Cocoa[2471:1581789] CGRect–{{0, 20}, {320, 568}}
这一过程,不知道是怎么来的
对比其他应用程序,录制视频是比较常见的功能,但很少遇到这种情况,其应用大都在录制之后进行了较长时间的视频处理过程,red statusbar不会出现,因此也可以参考这类设计。
目前采用了以下方法进行临时处理,计划进一步研究出下移过程的触发逻辑再进行系统的修改:
[self.window.rootViewController.view addObserver:self forKeyPath:kRootViewFrame options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
// 监视rootViewController上移
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if ([keyPath isEqualToString:forKeyPath:kRootViewFrame]) {
CGRect convertRect = [self.window.rootViewController.view convertRect:self.window.rootViewController.view.frame toView:nil];
if (lastRect.origin.y == kRedStatusBarHeight && convertRect.origin.y == 0) {
dispatch_async(dispatch_get_main_queue(),^{
self.window.rootViewController.view.frame = [UIScreen mainScreen].bounds;
});
}
lastRect = convertRect;
NSLog(@"CGRect--%@", NSStringFromCGRect(convertRect));
}
}