调整通话状态栏的大小?

时间:2009-07-11 20:23:04

标签: iphone uiview statusbar

如何根据笔尖的通话中状态栏调整视图大小?

我认为它只是设置调整大小属性,但它们没有为根UIView启用。

(我认为我的主要问题是我不知道这是什么调用;我找不到任何文档中的调用状态栏的引用,除非它谈到模拟器菜单命令。)

11 个答案:

答案 0 :(得分:24)

每当状态栏发生变化时,iOS都会调用viewController的 viewWillLayoutSubviews 方法。您可以覆盖它并根据新边界调整子视图。

- (void)viewWillLayoutSubviews {
    // Your adjustments accd to 
    // viewController.bounds

    [super viewWillLayoutSubviews];
}

答案 1 :(得分:16)

您正在寻找 - [UIApplication statusBarFrame],并且在您的UIApplicationDelegate中,您应该实现此委托方法,以便在状态栏的帧发生更改时得到通知:

- (void)application:(UIApplication *)application didChangeStatusBarFrame:(CGRect)oldStatusBarFrame  

答案 2 :(得分:7)

如果未设置根视图控制器,则视图可能无法自动调整状态栏大小。我最初在我的应用代理中有这个,并且我的应用程序在所有方面都正常工作,除了它在电话呼叫期间无法正确调整大小。

[self.window addSubview:rootController.view];

我将上面的行更改为此,现在我的应用会在通话期间自动调整大小。

[self.window setRootViewController:rootController];

在日志中查看此内容并调查原因后,我发现了此修复程序。

Application windows are expected to have a root view controller at the end of application launch

答案 3 :(得分:7)

当我的应用程序在后台运行并按下命令+ T时,这对我很有用。在我的场景中,根控制器是我的标签栏控制器,我在每个标签内重新调整我的导航控制器。

- (void)application:(UIApplication *)application willChangeStatusBarFrame:(CGRect)newStatusBarFrame{
[UIView animateWithDuration:0.35 animations:^{
    CGRect windowFrame = ((UINavigationController *)((UITabBarController *)self.window.rootViewController).viewControllers[0]).view.frame;
    if (newStatusBarFrame.size.height > 20) {
        windowFrame.origin.y = newStatusBarFrame.size.height - 20 ;// old status bar frame is 20
    }
    else{
        windowFrame.origin.y = 0.0;
    }
    ((UINavigationController *)((UITabBarController *)self.window.rootViewController).viewControllers[0]).view.frame = windowFrame;
}];

}

答案 4 :(得分:6)

当你说“没有为根UIView启用调整大小属性”时,你是什么意思?

通话中状态栏没有任何特殊的特殊标识,我认为它周围没有任何API或通知。相反,您的视图应该只是设置为正确自动调整大小。

尝试在Xcode中创建一个新的基于导航的应用,并在RootViewController.xib中研究表视图上的自动调整大小设置。希望您会看到Apple的设置与您在项目中设置的内容之间的差异。

答案 5 :(得分:3)

对于像UITableView这样的视图,您通常需要更改表格单元格高度,除了实现 application:didChangeStatusBarFrame:之外,没有其他方法可以做到这一点。但它并不重要,如果需要,可以将行高设置为非整数值。

答案 6 :(得分:2)

状态栏更改框的通知是

UIApplicationWillChangeStatusBarFrameNotification

以观察员身份注册:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(statusBarFrameWillChange:)name:UIApplicationWillChangeStatusBarFrameNotification object:nil];

然后回复处理程序中的更改:

- (void)statusBarFrameWillChange:(NSNotification*)notification { // respond to changes }

即使正确设置了自动布局,您也可能需要响应更改。例如,在状态栏更改后,根据屏幕中的给定空间计算其单元格高度的表格视图可能需要reloadData

Documentation

答案 7 :(得分:1)

我遇到了同样的问题。我做的是这个。

  1. 在IB
  2. 中打开xib文件
  3. 默认情况下,所有界面元素都与顶部一起移动,并在“尺寸检查器”的“自动调整大小”属性中显示。因此,对于屏幕底部的UI元素,从顶部删除链接,而不是从底部创建链接。保留所有其他原样。
  4. 解决问题!!!
  5. 我希望我很清楚。

答案 8 :(得分:1)

如果以编程方式设置视图框,则必须手动更新视图

 -(void) viewDidAppear:(BOOL)animated
{
    [[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(statusBarFrameWillChange:)name:UIApplicationWillChangeStatusBarFrameNotification object:nil];

}

- (void)statusBarFrameWillChange:(NSNotification*)notification
{
// respond to changes
NSLog(@"STATUS BAR UPDATED");
NSDictionary *statusBarDetail = [notification userInfo];
NSValue *animationCurve = statusBarDetail[UIApplicationStatusBarFrameUserInfoKey];
CGRect statusBarFrameBeginRect = [animationCurve CGRectValue];
int statusBarHeight = (UIInterfaceOrientationIsPortrait([[UIApplication sharedApplication]statusBarOrientation])) ? statusBarFrameBeginRect.size.height : statusBarFrameBeginRect.size.width;

NSLog(@"status bar height  %d", statusBarHeight);
}

-(void) viewDidDisappear:(BOOL)animated
{
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationBackgroundRefreshStatusDidChangeNotification object:nil];
}

这为您提供状态栏的新高度,使用它可以相应地更新您的帧。

答案 9 :(得分:0)

解决方案是确保您已经设置了窗口密钥:

[window makeKeyAndVisible];

如果你不这样做,子视图不会自动调整大小,但据我所知,没有其他症状。

答案 10 :(得分:0)

之前发布的解决方案都没有为我工作。对我有用的是我没有为我的观点正确设置约束。在我的情况下,我在视图中有两个不同的容器视图。

View of scene in storyboard.

底部(在列表中)容器视图是UITableView,它没有正确滚动到表格的底部。原因是呼叫状态栏的偏移导致UITableView的原点(左上角)发生变化,但大小将保持不变。这意味着桌子底部不在屏幕上了!

解决方案是正确设置 Autoresizing 高度约束。在下面的屏幕截图中,它是 Autoresizing 框中间的垂直箭头。

enter image description here