如何根据笔尖的通话中状态栏调整视图大小?
我认为它只是设置调整大小属性,但它们没有为根UIView启用。
(我认为我的主要问题是我不知道这是什么调用;我找不到任何文档中的调用状态栏的引用,除非它谈到模拟器菜单命令。)
答案 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
。
答案 7 :(得分:1)
我遇到了同样的问题。我做的是这个。
我希望我很清楚。
答案 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)
之前发布的解决方案都没有为我工作。对我有用的是我没有为我的观点正确设置约束。在我的情况下,我在视图中有两个不同的容器视图。
底部(在列表中)容器视图是UITableView
,它没有正确滚动到表格的底部。原因是呼叫状态栏的偏移导致UITableView
的原点(左上角)发生变化,但大小将保持不变。这意味着桌子底部不在屏幕上了!
解决方案是正确设置 Autoresizing 高度约束。在下面的屏幕截图中,它是 Autoresizing 框中间的垂直箭头。