我怎样才能让我的观点调整大小以响应从我的笔尖实现通话状态栏?
我想这也只是设置调整大小的属性,但是他们没有根的UIView启用。
(我想我在这里主要的问题是我不知道任何这就是所谓的,我找不到任何除非它谈到了模拟器菜单命令的文档来实现通话状态栏任何引用。)
我怎样才能让我的观点调整大小以响应从我的笔尖实现通话状态栏?
我想这也只是设置调整大小的属性,但是他们没有根的UIView启用。
(我想我在这里主要的问题是我不知道任何这就是所谓的,我找不到任何除非它谈到了模拟器菜单命令的文档来实现通话状态栏任何引用。)
你是什么意思时,你说的是“调整大小的属性不会对根的UIView启用”呢?
通话中状态栏不具有任何特别的特殊的标志,我不认为有周围没有任何的API或通知。 相反,你的意见应该被简单地设置为正确自动调整。
尝试Xcode的创建新的基于导航的应用程序,并在RootViewController.xib表视图研究AUTORESIZE设置。 希望你会看到苹果的一套,你已经在你的项目设置什么之间的增量。
每当有状态栏的变化,iOS将调用您的viewController的viewWillLayoutSubviews方法。 可以覆盖,并根据新的边界调整子视图。
- (void)viewWillLayoutSubviews {
// Your adjustments accd to
// viewController.bounds
[super viewWillLayoutSubviews];
}
你要找的 - [UIApplication的statusBarFrame],并在你的UIApplicationDelegate,你应该实现这个委托方法通知状态栏的框架发生变化时的:
- (void)application:(UIApplication *)application didChangeStatusBarFrame:(CGRect)oldStatusBarFrame
视图可能不会自动与状态栏大小的变化,如果你没有一个根视图控制器设置调整。 我本来这在我的应用程序委托,和我的应用程序,不同的是它不会在电话正确地调整各个方面都工作正常。
[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
这对我的作品完美,当我的应用程序在后台运行,我按下Command + 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;
}];
}
对于类似的观点,你的UITableView通常会需要改变表格单元格的高度,而且也没有其他办法做到这一点,除了实现应用程序:didChangeStatusBarFrame:。 但它根本不算什么,你可以设置行的高度,以非整数值,如果你需要。
对于状态栏变化的帧的通知是
UIApplicationWillChangeStatusBarFrameNotification
注册作为观察员:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(statusBarFrameWillChange:)name:UIApplicationWillChangeStatusBarFrameNotification object:nil];
然后在回应您的处理程序发生变化:
- (void)statusBarFrameWillChange:(NSNotification*)notification { // respond to changes }
即使有自动版式设置正确,你可能需要对变化做出反应。 例如,基于在屏幕上给定的空间的单元格高度的表视图将可能需要reloadData
状态栏更改后。
文档
我有同样的问题。 我所做的就是这一点。
我希望我是清楚的。
你将不得不更新视图手动,如果你是编程设置视图帧
-(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];
}
这使您可以在状态栏的新高度,并利用这一点,你可以相应地更新你的框架。
解决的办法是,以确保您进行了窗口键:
[window makeKeyAndVisible];
如果你不这样做,子视图不会被自动调整大小,但有没有其他症状,据我所知。
该解决方案中没有帐前为我工作。 做什么工作对我来说,我没有我的约束正确地设置自己的看法。 在我的情况,我有我的看法,在两个不同的容器看法。
的底部(在列表)容器视图是一个UITableView
,这是不正确地滚动到表的底部。 其原因是,抵消通话中状态栏是造成的原点(左上角) UITableView
改变,但规模将保持此相同。 这意味着,该表的底部是关闭屏幕!
解决的办法是正确设置高度自动调整大小约束正常。 下面的屏幕截图,它是在盒自动调整大小的中间的垂直箭头所示。