Iphone-如何在切换呼叫状态栏时调整视图大小?

时间:2010-10-16 01:16:38

标签: iphone objective-c ios-simulator

我正在创建一个在控制器内部有少量元素的iphone应用程序(例如标签栏,uiview,uitoolbar等)。一切正常,直到我遇到这个问题。当我的应用程序启动时,我接到一个电话,它显示了“呼叫状态栏”,它破坏了ui。一些元素被推下,因为“呼叫状态栏”占据了顶部空间。

这里的任何人都知道如何解决这个问题?我是iPhone应用程序开发的新手。

非常感谢您的回复......

最诚挚的问候,

4 个答案:

答案 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代码都在这个函数中。