【问题标题】:Status bar frame changes without any notification状态栏框架在没有任何通知的情况下更改
【发布时间】:2012-10-07 21:53:25
【问题描述】:

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

这是我注册通知的方式:

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

在我们的应用程序的某些地方,我们显示/隐藏状态栏:

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

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

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

【问题讨论】:

  • Hmmm... 在方向更改上对我有用,但不适用于 setStatusBarHidden。当我在模拟器上模拟电话时,我确实会调用它。

标签: ios nsnotificationcenter uistatusbar


【解决方案1】:

我知道这个问题是不久前发布的,但是这个问题很烦人! 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

这有点 hacky,但我喜欢它,因为我可以使用相同的通知观察器来监听通话状态栏框架的变化和我的手动 setStatusBarHidden 框架的变化。

希望这对某人有所帮助!

【讨论】:

  • 这假设状态栏是 20 点高,通常是这样,但有时是 40(在通话中,当热点处于活动状态等时),但这是个好主意。
  • 好点。我不知道 setStatusBarHidden 实际上隐藏了通话状态栏。我以为它只隐藏了正常的状态栏。好吧...我想您可以修改此函数以仅触发 UIApplicationDidChangeStatusBarFrameNotification 通知并传递 userInfo 中的实际状态栏高度。
  • @progrmr 我修复了类别函数以使用 UIApplication 的 statusBarFrame。不幸的是,这意味着我们不能再可靠地触发带有正确 userInfo 的 UIApplicationWillChangeStatusBarFrameNotification 通知。
猜你喜欢
  • 1970-01-01
  • 2018-07-04
  • 2020-01-17
  • 1970-01-01
  • 2020-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-31
相关资源
最近更新 更多