我想询问有关自动布局和通话状态栏的信息。这是一个简单的场景,演示了我的问题:
表视图应该有4个布局约束(前导,上限,尾随,底部)到Superview,常量设置为0。
现在,当我在模拟器中运行此应用程序并按⌘ + T 时,我可以看到红色背景,而通话状态栏可以设置动画。是否可以获取摆脱这个小故障?
答案 0 :(得分:8)
(由于缺乏声誉而使用答案而非评论,抱歉。)
我也遇到了这个问题并且正在尝试例如上面提到的解决方案:它对我没用。
所以我created a repository使用示例代码来揭示原始海报的问题。这些场景有示例应用程序:
事实证明solution from CEarwood实际上有效...当自定义视图控制器是UINavigationController的子代(案例2和4)时。 Hoewever,它在案例1和3中不起作用。
我希望这些信息有用。
答案 1 :(得分:7)
对于纯粹的自动布局答案,您可以获得对底部约束的引用,并在收到UIApplicationWillChangeStatusBarFrameNotification时调整其常量,并在收到DidChange通知时返回0。这是我使用的测试VC:
@interface CEViewController ()
@property (nonatomic, strong) IBOutlet NSLayoutConstraint *bottomConstraint;
@end
@implementation CEViewController
- (void)viewDidLoad {
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(statusBarFrameWillChange:) name:UIApplicationWillChangeStatusBarFrameNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(statusBarFrameDidChange:) name:UIApplicationDidChangeStatusBarFrameNotification object:nil];
}
- (void)statusBarFrameWillChange:(NSNotification *)note {
NSValue *newFrameValue = [note userInfo][UIApplicationStatusBarFrameUserInfoKey];
self.bottomConstraint.constant = newFrameValue.CGRectValue.size.height;
[self.view setNeedsLayout];
}
- (void)statusBarFrameDidChange:(NSNotification *)note {
self.bottomConstraint.constant = 0;
[self.view setNeedsLayout];
}
@end
答案 2 :(得分:2)
这是屏幕调整大小的效果。
当显示通话中状态栏时,视图会调整其大小,使其处于通话状态栏的活动状态,然后在状态栏更改大小时向下移动。
短暂的时间,表视图下的视图是可见的。您可以做的是在表格视图下添加一个向下延伸到屏幕外的视图,以掩盖背景颜色。
另一种方法是使用AppDelegate
,实现:
-application:willChangeStatusBarFrame:
并调整表格视图的大小以覆盖暴露的位。然后,当调用 - application:didChangeStatusBarFrame:
时,将其调整为原始大小。