我已注册接收有关状态栏框架更改的通知,但从未收到过。
以下是我注册通知的方式:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(appWillChangeStatusBarFrameNotification:)
name:UIApplicationWillChangeStatusBarFrameNotification
object:nil];
在我们的应用中的某些地方,我们会显示/隐藏状态栏:
[[UIApplication sharedApplication] setStatusBarHidden:maximize
withAnimation:UIStatusBarAnimationSlide];
但是,当启用个人热点或拨打电话时,它也可以改变大小。有没有办法在它改变时获得实际的状态栏框架?
This question表示由于SDK错误而导致通知不起作用,至少对于方向更改而言。这是什么原因?有没有解决方法?
答案 0 :(得分:7)
我知道这个问题已经发布了一段时间,但这个问题很烦人! UIApplicationWillChangeStatusBarFrameNotification
和UIApplicationDidChangeStatusBarFrameNotification
通知仅在方向更改和通话中状态栏高度更改时触发。
我通过编写自己使用的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框架更改。
希望这有助于某人!