自动布局和通话状态栏

我想问一下自动布局和通话状态栏。 这是一个简单的场景,演示了我的问题:

  1. 使用“使用故事板”启用项目创build
  2. 添加“视图控制器”并启用其“是初始视图控制器”
  3. 将控制器视图的背景颜色设置为红色
  4. 在控制器视图中添加“表格视图”

表视图应该有4个布局约束(领先,顶部,尾部,底部)的Superview常量设置为0。

现在,当我在模拟器中运行这个应用程序,并按 + T我可以看到红色的背景,而通话状态栏animation英寸是否有可能摆脱这个毛刺?

(由于缺乏声誉而使用回答而不是评论,对不起。)

我也遇到了这个问题,正在尝试,例如上面指出的解决scheme:它不适合我。

于是我用示例代码创build了一个存储库 ,以揭示原始海报的问题。 有这些情况的示例应用程序:

  1. 自定义视图控制器是窗口的根视图控制器,
  2. 自定义视图控制器是UINavigationController的子窗口,它是窗口的根视图控制器,
  3. 自定义视图控制器是UITabBarController的子窗口,它是窗口的根视图控制器
  4. 自定义视图控制器是一个UINavigationController的孩子,它是作为窗口的根视图控制器的UITabBarController的孩子。

原来, 从CEarwood的解决scheme实际上工作…当自定义视图控制器是一个UINavigationController(情况2和4)的孩子。 Hoewever,它不适用于情况1和3。

我希望这个信息是有用的。

对于纯粹的自动布局答案,您可以获得对底部约束的引用,并在收到UIApplicationWillChangeStatusBarFrameNotification时调整它的常量,并在收到DidChange通知时返回0。 这是我使用的testingVC:

@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 

这是从屏幕大小调整的效果。

当出现通话状态栏时,视图将调整为当通话状态栏处于活动状态时的大小,然后在状态栏更改大小时向下移动。

在短时间内,表视图下的视图是可见的。 你可以做的是在向下延伸出屏幕的表格视图下添加一个视图来掩盖背景颜色。

另一种方法是用你的AppDelegate ,实现:

 -application:willChangeStatusBarFrame: 

并调整表格视图以覆盖暴露的位。 然后,当application:didChangeStatusBarFrame:被调用时,将其重新调整为原始大小。