2012-10-07 43 views
9

我已注册接收有关状态栏框架更改的通知,但它们从未收到。状态栏框的更改没有任何通知

这里是我注册的通知:

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(appWillChangeStatusBarFrameNotification:) 
              name:UIApplicationWillChangeStatusBarFrameNotification 
              object:nil]; 

在我们的应用中的一些地方,我们显示/隐藏与状态栏:

[[UIApplication sharedApplication] setStatusBarHidden:maximize 
             withAnimation:UIStatusBarAnimationSlide]; 

但它也可以改变大小时个人热点启用或在打电话时。有什么方法可以在实际状态栏框架发生变化时获取?

This question意味着由于SDK错误,通知不起作用,至少对于方向更改。这是原因吗?有什么解决方法吗?

+0

嗯...适合我的方向变化,但不适用于setStatusBarHidden。当我在模拟器上模拟一个电话时,我确实得到它。 – rdelmar

回答

6

我知道这个问题发布了一段时间后,但这个问题是一个恼人的! UIApplicationWillChangeStatusBarFrameNotificationUIApplicationDidChangeStatusBarFrameNotification通知仅触发方向更改和通话状态栏高度更改。

我通过编写我自己的setStatusBarHidden类别函数来解决此问题,而不是使用正常的UIApplication函数。不幸的是(正如@progrmr指出的那样),因为状态栏的高度可能是20像素或40像素(我们不知道隐藏状态栏的框架会在未隐藏之前变成什么样子),但我们只能可靠地触发具有正确userInfo的单个通知(UIApplicationDidChangeStatusBarFrameNotification)。下面是我所做的:

@implementation UIApplication (statusBar) 

- (void)setStatusBarHiddenWithNotification:(BOOL)hidden withAnimation:(UIStatusBarAnimation)animation 
{ 
    if (self.statusBarHidden == hidden) return; 

    [self setStatusBarHidden:hidden withAnimation:animation]; 
    [NSNotificationCenter.defaultCenter postNotificationName:UIApplicationDidChangeStatusBarFrameNotification 
                 object:nil 
                userInfo:@{UIApplicationStatusBarFrameUserInfoKey: [NSValue valueWithCGRect:self.statusBarFrame]}]; 
} 

@end 

这是稍微哈克,但我喜欢它,因为我可以使用相同的通知观察员监听双方通话中的状态栏架的变化和我的手动setStatusBarHidden帧之间的变化。

希望这可以帮助别人!

+0

这是假定状态栏高20点,通常是40点(在打电话时,热点活跃时等),但这是个不错的主意。 – progrmr

+0

好点。我不知道setStatusBarHidden实际上隐藏了通话状态栏。我以为它只隐藏了正常的状态栏。那么...我想你可以修改这个函数来触发UIApplicationDidChangeStatusBarFrameNotification通知并传递userInfo中的实际状态栏高度。 –

+0

@progrmr我修复了类别函数以使用UIApplication的statusBarFrame。不幸的是,这意味着我们不能再可靠地触发附加了正确的userInfo的UIApplicationWillChangeStatusBarFrameNotification通知。 –