iOS - 状态栏随机变为纯黑色

5

开发iPhone应用。

我遇到了一个非常奇怪的问题,就是偶尔屏幕顶部的状态栏会变成纯黑色。不是黑色版本的状态栏,而是一个没有文本或图标的纯黑色矩形。这种情况很少发生,但通常似乎是在通过多任务处理返回应用程序或从锁定设备返回时发生的(应用程序一直在后台运行)。我看到它在3GS和iPhone4上都发生过。以下是截图:

enter image description here

我无法在尝试时重现它,它似乎最终会在某个时间点发生(有时会连续几天没有发生)。

一旦出现这种情况,除了我在应用程序中执行的特定操作会导致一切突然冻结(应用程序不会崩溃,但屏幕上的所有内容都被冻结且无法交互),应用程序似乎会继续正常运行,即使状态栏已经消失。在修复黑色状态栏出现后,重置应用程序是唯一的方法。

还有其他人经历过这种情况吗?我无法找到任何解释类似行为的线程,这让我感到疯狂。


这是什么特定的操作导致应用程序冻结?您已经检查了内存消耗吗? - Pascalius
Pascalius,我正在等待我的开发人员回复有关内存消耗和导致应用程序冻结的具体操作。每个出现该错误的设备都是iOS 4.2.1。我刚刚进行了大量测试,并在从电话返回到应用程序(在后台运行)之后三次重现了该错误。这似乎与此有关,但完全不一致。我这样做了大约50次(从电话通话转到应用程序),但只有3次出现了该错误。 - Gabe
有一次,这个错误出现了一些不同。黑色的条形图出现在状态栏下面,而屏幕的其余部分被推下来了。看起来可能与绿色的“触摸此处返回电话”UI有关,当您的电话呼叫在后台运行时会出现。 - Gabe
我假设一个绘制某物的方法出了问题或者得到了错误的参数。 - Pascalius
好吧,我们至少确定它与电话呼叫无关,因为已经在没有任何电话呼叫发生的情况下重现了。内存消耗已经检查过了,那不是问题。我的开发人员从未在他的iPod Touch或3G上看到过这种情况。我在3GS、iPhone4和iPad上看到过数十次。 - Gabe
显示剩余3条评论
4个回答

2

有一次在我的应用程序中,当我在将UIView的自定义子类实例添加为其父视图的子视图之前调用绘图方法时,出现了问题。

解决方案显然很简单:先将其作为子视图添加,然后再发送/调用任何自定义绘图方法。

示例:

CustomView *aView = [[CustomView alloc] init];

[aView drawSomething];

[self.view addSubview:aView]; //wrong approach
[aView release];

应该是:

CustomView *aView = [[CustomView alloc] init];

[self.view addSubview:aView];
[aView release];

[aView drawSomething];

0

截图丢失了,但是你所描述的情况听起来好像是你错误地实现了使用苹果内置的视图控制器。

无论是UINavigationController还是UITabBarController,如果它们检测到屏幕上“应该”有状态栏,它们都会自动将它们内部的所有内容向下移动20像素。

我猜你有一些代码正在删除状态栏,但是这些代码在苹果代码已经检测到并将所有内容向下移动以适应时才启动。

“修复”的方法是非常仔细地重新阅读苹果类的文档,并按照苹果的指示使用它们(通常,人们使用它们的方式似乎很合理 - 例如将它们嵌入其他视图中 - 但苹果已明确声明不支持这些用法。遗憾的是,这些来自苹果的类非常脆弱)


可能是因为我错误地使用了UINavigationController,尽管我没有任何代码来移除状态栏。 - Bryan Irace
唯一可能遮挡状态栏的另一件事是,如果您有一些代码添加自定义UIWindow实例,并将它们声明为状态栏层或高于状态栏层(例如,警报层更高,如果我没记错)。也许是某些第三方代码这样做了?我会在整个项目中搜索UIStatusBar和UIWindow。 - Adam
这是我复现的方式:-使用QLPreviewController全屏查看某些内容-关闭预览控制器-将应用程序置于后台-将应用程序置于前台-状态栏消失,窗口的背景颜色可见。我无法弄清楚为什么会发生这种情况或如何修复它。 - Bryan Irace

0

你是否持有一个 QLPreviewController 实例的引用?我在我的应用程序中通过创建一个新的自动释放的 QLPreviewController 来解决这个问题,每当我需要以模态方式显示文件时,而不是一遍又一遍地重复使用同一个实例。


我们解决了问题,但不确定具体是如何解决的。我们重写了大部分UIViewController代码,并确保遵循了苹果的指南,看起来问题已经解决了。因此,我不确定具体是什么解决了它,因为我不知道最初是什么导致了这个问题。 - Gabe
我们发布了应用程序,认为这个问题已经解决了。但是,事实证明它并没有被解决。我们仍然无法弄清楚问题出在哪里。Bryan,我们根本不使用QLPreviewController,所以看来我们的问题是由不同的原因引起的。还有其他人有什么想法吗?这让我感到非常疯狂,现在我的应用程序已经上线了,人们经常遇到这个错误。如果你好奇,这个应用程序叫做Prose with Bros。这个错误很难复制,但它会无限期地发生。 - Gabe

0

我曾经遇到过类似的问题,我在这个问题这里中进行了描述。

如果你有这样的问题,请尝试删除任何由引用[UIScreen mainScreen].applicationFrame创建的CGRect框架,并改为使用更手动的定义来创建框架。如果这样可以解决问题,那么你可以决定如何继续处理。


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