如何检测双倍高度状态栏?

9
HIG(第47页)指出,在通话或录音期间出现的双倍高度状态栏必须能够处理。我应该如何处理这种情况?在其他屏幕上,当双倍高度状态栏出现时,事情只是有点挤,但仍可用。如果我能检测到双倍高度状态栏的存在,我可以调整文本字段的位置或使它们暂时变短,但是是否可能检测到双倍高度状态栏的存在?编辑:也许如果有一种方法可以获取已知事物的绝对坐标,例如导航栏,如果它偏移了20个像素,我会认为双倍高度状态栏存在。您觉得呢?还有一个次要问题,如果这个方法或任何其他方法有效,我只想隐藏常规状态栏。
[[UIApplication sharedApplication] setStatusBarHidden:YES animated:NO]

但是我不想同时隐藏两个状态栏 - 基本上这是一种懒惰的方式,不需要触摸任何一个屏幕 - 如果双倍在那里,通过隐藏常规状态栏将其变为单倍。上面的代码会同时隐藏两个吗?

2个回答

16

您可以监控UIApplicationDelegate的这些回调函数:

  • application:willChangeStatusBarFrame:

  • application:didChangeStatusBarFrame:

在iPhone模拟器中很容易测试:Hardware->Toggle In-Call Status Bar

根据您的情况,您的视图及其中的内容可以自动调整大小以适应空间 - 在Interface Builder的检查器窗口中检查各种对象的“视图大小”区域。


这会解决用户正在通话或录音的情况,然后进入我的应用程序吗?还是只监视应用程序中的更改? - Matt Winters
好的,也许你可以检查一下UIApplicationStatusBarFrameUserInfoKey。 - Ryan Bavetta
感谢您指引我正确的方向。为了在进入应用程序之前处理呼叫起源,在某些viewDidLoad中,我只需检查状态栏框架的大小 - 如果超过20,则假定呼叫正在进行中并相应地调整视图大小。我在委托方面遇到了麻烦。当将该方法放在我的AppDelegate中时,它会触发,但是当将其放在我需要的类中时,即使在该类中采用UIApplicationDelegate,它也不会触发,因此不知道如何处理在每个类内开始或结束的呼叫 - 从AppDelegate中的方法到我想要更改视图的类的桥接是什么? - Matt Winters
解决委托问题。 - Matt Winters

1

当用户使用其他实用工具(如热点)时,也会出现此问题。为了解决此问题,我使用以下代码行(因为我自己陷入了困境)。

self.tabBarController?.tabBar.autoresizingMask = UIViewAutoresizing(rawValue: UIViewAutoresizing.RawValue(UInt8(UIViewAutoresizing.flexibleWidth.rawValue) | UInt8(UIViewAutoresizing.flexibleTopMargin.rawValue)))

同一问题的Objective C参考资料在此处可用


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接