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];
}
基本上你通常做的是试图建立你的所有UI元素的自动调整大小旗帜界面生成器,这样,当主视图被通话状态栏“压扁”,一切仍将看起来合理。解释如何在一条消息中完成所有这些都很困难,但我建议在IB中创建一个视图,在其中放置一些子视图,然后调整主视图的大小,同时使用autoresize标志来获得标记工作。 autoresize标志位于Command-3(大小检查器)中。
您也可以将主视图控制器中的wantsFullScreenLayout
设置为YES,以使视图占据整个屏幕,包括状态栏下的区域,但是您必须确保不要在当然,状态栏和通话状态栏会重叠太近。
对于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];
}
伟大的答案,除了你意外(基于原来的问题,无论如何)使用'UIApplicationWillChangeStatusBarOrientationNotification'而不是'UIApplicationWillChangeStatusBarFrameNotification'。如果您试图找出通话中绿色状态栏何时出现或消失,您需要后者:“UIApplicationWillChangeStatusBarFrameNotification”。 – 2012-06-22 17:42:57
非常真实,感谢您的更新! – 2014-04-03 09:56:10
对我来说,只要状态栏放大, - (无效)viewWillLayoutSubviews总是被调用。这对我来说是完美的,因为我所有的子视图setFrame代码都在这个函数中。
这适用于我......谢谢 – 2010-10-16 02:51:02
请参阅@ process255以获得更正确的答案。另外使用裸字符串来发布/订阅通知是不好的做法(容易出错和拼写错误,您应该事先定义您的'NSString * const'通知名称)。 – 2014-08-05 11:35:02
@dianz你已经在字典中切换了键值。 “触发”应该是关键。 – Kof 2014-12-07 08:41:21