如何检测双高状态栏?

Posted

技术标签:

【中文标题】如何检测双高状态栏?【英文标题】:How do I detect a double-height status bar? 【发布时间】:2011-03-26 03:01:39 【问题描述】:

HIG (p.47) 说我必须能够处理在通话或录音期间出现的双倍高度状态栏。

我该如何处理这种情况?

我真的只有 1 个屏幕,当双高状态栏显示时,带有工具栏的键盘覆盖在文本字段下方 - 在其他屏幕上,东西只是有点皱巴巴但可以使用。

如果我可以检测到双高状态栏存在,我可能会调整文本字段的位置或使它们暂时变短,但是否可以检测到双高状态栏何时存在?

编辑:也许如果有一种方法可以获得已知事物的绝对坐标,例如导航栏,并且如果它偏离 +20 像素,我会假设存在双高状态栏。想法?

还有一个次要问题,如果这个(或任何东西)有效,我只想使用

隐藏常规状态栏
[[UIApplication sharedApplication] setStatusBarHidden:YES animated:NO]

但我不想同时隐藏两者 - 基本上是一种不必触摸我的任何屏幕的懒惰方式 - 如果存在双重,则通过隐藏常规状态栏再次使其成为单一。上面的代码会隐藏两者吗?

【问题讨论】:

【参考方案1】:

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

应用程序:willChangeStatusBarFrame:

应用程序:didChangeStatusBarFrame:

而且很容易在 iphone 模拟器中进行测试:Hardware->Toggle In-Call Status Bar

根据您的情况,您的视图和其中的东西可以自动调整大小以适应空间 - 检查不同对象的 Interface Builder 中检查器窗口的 View Size 区域

【讨论】:

这会解决用户正在通话或正在录制的情况然后进入我的应用程序吗?还是只会在应用中监控一次更改? 好的,也许你可以检查 UIApplicationStatusBarFrameUserInfoKey 感谢您为我指明了正确的方向。要在进入应用程序之前处理呼叫发起,在某些 viewDidLoad 中,我只需检查状态栏框架的大小 - 如果超过 20,则假设正在进行呼叫并相应地调整视图大小。我遇到了代表的麻烦。它在方法放入我的 AppDelegate 时触发,但在我需要它的类中时不会触发,即使我在该类中采用 UIApplicationDelegate 所以不确定如何处理在每个类中开始或结束的调用 - 什么是桥梁AppDelegate 中的方法到我要更改视图的类? 整理代理问题【参考方案2】:

当用户使用许多其他实用程序(如热点)时也会出现此问题。为了解决这个问题,我使用以下代码行(因为我自己被困在这个问题中)。

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

Objective C reference for same issue available here

【讨论】:

以上是关于如何检测双高状态栏?的主要内容,如果未能解决你的问题,请参考以下文章

IIViewDeck & 双高状态栏

Android 多窗口支持:检测状态栏是不是可见?

检测用户是不是有通话状态栏

状态栏区域未检测到点击手势?

应用程序如何检测状态栏颜色(Android 5.0 Lollipop)?

jQuery - 检测 iPhone 通话状态栏