2013-05-08 77 views
13

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

  1. 与“使用故事板”创建项目启用
  2. 添加“视图 - 控制器”,并启用其“在初始视图控制器”控制器的看法
  3. 设置背景颜色红色
  4. 添加“表视图”到控制器的视图

表视图应具有4个布局约束(领先,顶部,后,底部)与常数设定为上海华0

现在,当我在模拟器中运行这个程序,并按下 + 牛逼我可以看到红色的背景,而在通话状态栏的动画。是否有可能摆脱这种故障呢?

+0

在通话状态栏将动画这是一种行为,即使你的应用程序出来后,你可以检查。它是'在呼叫状态栏按钮中切换'。不知道红色背景。 – Amit 2013-05-08 12:12:18

+0

看起来像一个类似的问题:http://stackoverflow.com/questions/25882609/how-to-do-do-layout-to-handle-in-call-double-height-status-bar-for-custom-present/42507117 #42507117 – hhamm 2017-02-28 11:30:54

回答

7

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

我就遇到了这个问题,也是并被例如尝试上面指出的解决方案:它不适合我。

所以我created a repository与示例代码来揭露原来的海报的问题。有示例应用这些方案:

  1. 自定义视图控制器窗口的根视图控制器,
  2. 自定义视图控制器是一个UINavigationController这是窗口的根视图控制器的孩子,
  3. 的自定义视图控制器是UITabBarController的子项,它是窗口的根视图控制器,并且该自定义视图控制器是UINavigationController的子项,该UINavigationController是UITabBarController的子项,该UITabBarController是窗口的根视图控制器。

事实证明,solution from CEarwood实际上工作...当自定义视图控制器是一个UINavigationController(情况2和4)的孩子。 Hoewever,它在案件1和案件3中不起作用。

我希望这些信息有用。

+0

没有为我工作 – 2017-02-07 03:59:42

2

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

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

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

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

-application:willChangeStatusBarFrame: 

和调整表视图,以覆盖外露得到位。然后当调用 - application:didChangeStatusBarFrame:时,将其重新调整为原始大小。

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