UIAlertViews,UIActionSheets和keyWindow问题

时间:2013-11-06 15:32:43

标签: ios iphone objective-c uialertview uiwindow

我创建了一个iOS 7 passcode replica,我遇到了这个问题,我似乎无法解决。我需要将锁定屏幕视图放在其他所有内容之上,因此iOS的多任务视图中涵盖了应用程序,因此我将其直接添加到keyWindow。到目前为止一切都很好。

当我必须显示锁定屏幕时,如果有alertViewactionSheet(此帖子中仅提及alertView,为了保持简单),问题就出现了。已多次回答,iOS 7中没有引用alertView,这是真的,显示它们的窗口为_UIModalItemHostingWindow,其中有UIView个,实际上没有提到alertView

_UIModalItemHostingWindow 也会成为新的keyWindow ,因此它位于其他所有内容之上,但在[UIApplication sharedApplication].windows中找不到它,这意味着如果我添加锁定屏幕显示我之前的keyWindow(默认keyWindow,如果您愿意),它将位于alertView及其暗淡的背景下方,因此用户无法与锁定进行互动在解除alertView之前的屏幕。另一个选项在下面进一步详述。

锁定屏幕的工作方式如下:在applicationDidEnterBackground上,它会检查密码是否已启用;如果它已启用并且密码持续时间为0(用户选择立即锁定应用程序),它会立即添加锁定屏幕,因此它会覆盖多任务视图中的应用程序。现在,我上面提到的选项是将alertView添加到此_UIModalItemHostingWindow窗口,但是当返回到应用程序时,锁定屏幕视图显示延迟超过1秒(即使我添加了它在我去后台之前!)并且多任务处理视图中的任何内容都没有涵盖应用程序。 (目前它也显示在错误的位置,如果你继续下载它,那是固定的,但我还没有按下提交。)

我尝试隐藏removeFromSuperview这个_UIModalItemHostingWindow,但是当回到应用程序时,alertView动画仍然会像刚刚被解雇一样运行。我怀疑上面提到的延迟也是由于Apple在返回前台时如何处理alertViews

我还尝试创建一个新窗口并使其成为新的keyWindow,但同样的事情发生了。

这里有一个关于这个的小讨论,涵盖了我尝试的所有内容,也许我在这篇文章中遗漏了一些东西。 https://github.com/rolandleth/LTHPasscodeViewController/issues/16

有什么想法吗?除了创建我的应用程序内的每个alertViewactionSheet的手动引用,因为我正在尝试找到密码库的修复程序,而不是我自己的应用程序;我可以找到肮脏的解决方法,没问题:)

更新:如果使用_UIAlertOverlayWindow代替actionSheet,则窗口为alertView,但据我所知,其行为相同。

1 个答案:

答案 0 :(得分:2)

最简单的解决方案是使用锁屏窗口而不是锁屏视图。

创建一个新的UIWindow,将其框架设置为UIScreen边界,在那里放置一个应该处理旋转的简单rootViewController并显示“锁定屏幕”视图并设置{{1转到windowLevel

然后将窗口UIWindowLevelAlert + 1设置为hidden。你想要显示锁屏,只需将YES设置为hidden

我想在显示弹出窗口/操作表时以及键盘显示时键盘NO也不起作用(键盘在键窗口顶部有自己的窗口)。< / p>

相关问题