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

问题描述:

我正在创建一个iphone应用程序,里面有很少的元素(例如标签栏,uiview,uitoolbar等)。一切正常,直到我遇到这个问题。当我的应用程序启动时,我收到一个电话,并显示“呼叫状态栏”,它毁了用户界面。由于“呼叫状态栏”占据顶部的空间,部分元素被压低。Iphone-如何在通话状态栏切换时调整视图大小?

有人在这里有一个想法如何解决这个问题?我是iPhone应用程序开发的新手。

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

最好的问候,

你应该把这个功能上的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]; 
} 

此代码将发送通知的名称为“触发”

的地方,您的视图控制器代码(例如:viewDidLoad中,等。)这个听,如果有通知,名字“触发”

[[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]; 
} 
+0

这适用于我......谢谢 – 2010-10-16 02:51:02

+0

请参阅@ process255以获得更正确的答案。另外使用裸字符串来发布/订阅通知是不好的做法(容易出错和拼写错误,您应该事先定义您的'NSString * const'通知名称)。 – 2014-08-05 11:35:02

+0

@dianz你已经在字典中切换了键值。 “触发”应该是关键。 – Kof 2014-12-07 08:41:21

基本上你通常做的是试图建立你的所有UI元素的自动调整大小旗帜界面生成器,这样,当主视图被通话状态栏“压扁”,一切仍将看起来合理。解释如何在一条消息中完成所有这些都很困难,但我建议在IB中创建一个视图,在其中放置一些子视图,然后调整主视图的大小,同时使用autoresize标志来获得标记工作。 autoresize标志位于Command-3(大小检查器)中。

您也可以将主视图控制器中的wantsFullScreenLayout设置为YES,以使视图占据整个屏幕,包括状态栏下的区域,但是您必须确保不要在当然,状态栏和通话状态栏会重叠太近。

+0

对于iOS7/AutoLayout约束环境呢? – 2013-07-23 23:37:42

dianz的解决方案工作得很好,但如果您只想了解特定视图控制器内部的通知,则有点多余。

在应用委托中调用委托方法application:didChangeStatusBarFrame:之后UIApplicationDidChangeStatusBarFrameNotification通过[NSNotificationCenter defaultCenter]发布。

代替使用委托方法application:didChangeStatusBarFrame:来简单地重新发布自定义通知,您可以直接从您的视图控制器添加观察者到UIApplicationDidChangeStatusBarFrameNotification

在MyCustomViewController将添加类似这样:

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(doSomething:) 
              UIApplicationDidChangeStatusBarFrameNotification 
              object:nil]; 

现在你不再需要的appDelegate定义application:didChangeStatusBarFrame:委托方法(除非你打算做什么东西在的appDelegate时,状态栏更改大小)。

与dianz的例子中,你需要删除观察者的dealloc

- (void)dealloc { 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
    [super dealloc]; 
} 
+5

伟大的答案,除了你意外(基于原来的问题,无论如何)使用'UIApplicationWillChangeStatusBarOrientationNotification'而不是'UIApplicationWillChangeStatusBarFrameNotification'。如果您试图找出通话中绿色状态栏何时出现或消失,您需要后者:“UIApplicationWillChangeStatusBarFrameNotification”。 – 2012-06-22 17:42:57

+0

非常真实,感谢您的更新! – 2014-04-03 09:56:10

对我来说,只要状态栏放大, - (无效)viewWillLayoutSubviews总是被调用。这对我来说是完美的,因为我所有的子视图setFrame代码都在这个函数中。