我正在创建一个在控制器内部有少量元素的iphone应用程序(例如标签栏,uiview,uitoolbar等)。一切正常,直到我遇到这个问题。当我的应用程序启动时,我接到一个电话,它显示了“呼叫状态栏”,它破坏了ui。一些元素被推下,因为“呼叫状态栏”占据了顶部空间。
这里的任何人都知道如何解决这个问题?我是iPhone应用程序开发的新手。
非常感谢您的回复......
最诚挚的问候,
答案 0 :(得分:21)
dianz的解决方案工作正常,但如果您只想了解特定视图控制器内部的通知,则有点多余。
在应用程序代理application:didChangeStatusBarFrame:
中调用委托方法UIApplicationDidChangeStatusBarFrameNotification
后,[NSNotificationCenter defaultCenter]
将通过application:didChangeStatusBarFrame:
发布。
您可以直接从视图控制器向UIApplicationDidChangeStatusBarFrameNotification
添加观察者,而不是使用委托方法[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(doSomething:)
UIApplicationDidChangeStatusBarFrameNotification
object:nil];
来重新发布自定义通知。
在MyCustomViewController中,您可以添加与此类似的内容:
application:didChangeStatusBarFrame:
现在您不再需要在appDelegate中定义- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
[super dealloc];
}
委托方法(除非您计划在状态栏更改大小时在appDelegate中执行某些操作)。
与dianz的示例一样,您需要删除dealloc中的观察者
{{1}}
答案 1 :(得分:12)
你应该把这个功能放在appDelegate上,这会在状态栏改变时触发
- (void)application:(UIApplication *)application didChangeStatusBarFrame (CGRect)oldStatusBarFrame
{
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
[dict setObject:@"trigger" forKey:@"frame"];
[[NSNotificationCenter defaultCenter] postNotificationName:@"trigger" object:self userInfo:dict];
}
此代码将发送名称为“trigger”的通知
将代码放置到您的视图控制器(例如:viewDidLoad等)。如果有通知发送名称为“trigger”,则侦听
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(dataReceived:)
name:@"trigger"
object:nil];
并创建一个函数dataReceived:
- (void)dataReceivedNotification:(NSNotification *)notification {
NSDictionary *data = [notification userInfo];
// do something with data
}
在代码的这一部分做一些事情,也许你改变标签栏,uiview框架,工具栏框架的框架
在dealloc
中,输入此代码以删除观察者
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
[super dealloc];
}
答案 2 :(得分:3)
基本上你通常会尝试在界面构建器中设置所有ui元素的自动调整大小标志,这样当主视图被调用状态栏“压缩”时,一切看起来仍然合理。在一条消息中解释如何完成所有这些操作有点困难,但我建议在IB中创建一个视图,在其中放置一些子视图,然后在播放autoresize标志时调整主视图的大小以了解标志的方式工作。 autoresize标志位于Command-3(大小检查器)中。
您还可以将主视图控制器中的wantsFullScreenLayout
设置为YES,以使视图占据整个屏幕,包括状态栏下的区域,但是您必须确保不要放置当然,状态栏下的任何内容和通话状态栏都会与任何太靠近它的地方重叠。
答案 3 :(得分:1)
对我来说,每当状态栏放大时,总是会调用 - (void)viewWillLayoutSubviews。这对我来说是完美的,因为我的所有子视图setFrame代码都在这个函数中。