我创建了一个iOS 7 passcode replica,我遇到了这个问题,我似乎无法解决。我需要将锁定屏幕视图放在其他所有内容之上,因此iOS的多任务视图中涵盖了应用程序,因此我将其直接添加到keyWindow
。到目前为止一切都很好。
当我必须显示锁定屏幕时,如果有alertView
或actionSheet
(此帖子中仅提及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
有什么想法吗?除了创建我的应用程序内的每个alertView
和actionSheet
的手动引用,因为我正在尝试找到密码库的修复程序,而不是我自己的应用程序;我可以找到肮脏的解决方法,没问题:)
更新:如果使用_UIAlertOverlayWindow
代替actionSheet
,则窗口为alertView
,但据我所知,其行为相同。
答案 0 :(得分:2)
最简单的解决方案是使用锁屏窗口而不是锁屏视图。
创建一个新的UIWindow
,将其框架设置为UIScreen
边界,在那里放置一个应该处理旋转的简单rootViewController
并显示“锁定屏幕”视图并设置{{1转到windowLevel
。
然后将窗口UIWindowLevelAlert + 1
设置为hidden
。你想要显示锁屏,只需将YES
设置为hidden
。
我想在显示弹出窗口/操作表时以及键盘显示时键盘NO
也不起作用(键盘在键窗口顶部有自己的窗口)。< / p>