I created an iOS 7 passcode replica and I have this problem I can't seem to solve. I need the lock screen view to be on top of everything else, so the app is covered in iOS' multitasking view, so I add it directly to the keyWindow
. Everything fine so far.
The problem arises if there's an alertView
or actionSheet
(will only mention alertView
s in this post, to keep it simple) open when I have to display the lock screen. It has been answered several times that there are no references to alertView
s in iOS 7, which is true, and the window in which they are displayed is _UIModalItemHostingWindow
, which has 2 UIView
s, indeed with no reference to the alertView
.
This _UIModalItemHostingWindow
also becomes the new keyWindow
, so it's on top of everything else, but it can not be found in [UIApplication sharedApplication].windows
meaning if I add the lock screen to my former keyWindow
(the default keyWindow
, if you will), it will be beneath the alertView
and its dimmed background, so the user can't interact with the lock screen before dismissing the alertView
. The other option is detailed a bit further below.
The lock screen works like this: on applicationDidEnterBackground
it checks if the passcode is enabled; if it is enabled and the passcode duration is 0 (user selected to lock the app immediately), it adds the lock screen now, so it covers the app in the multitasking view. Now, the option I mentioned above is to add the alertView
to this _UIModalItemHostingWindow
window, but when returning to the app, the lock screen view is displayed with a 1+ second delay (even though I added it before I went to background!) and the app isn't covered by anything in the multitasking view. (Currently it's displayed in the wrong position too, if you go ahead and download it, that is fixed, but I didn't pushed the commit yet).
I tried hiding and removeFromSuperview
this _UIModalItemHostingWindow
, but when coming back to the app, the alertView
animation still runs as if it was just fired. I suspect the delay mentioned above also happens due to how Apple handles alertViews
when coming back to foreground.
I also tried creating a new window and to make that the new keyWindow
, but same thing happens.
Here's a small discussion about this, covering all the stuff I tried, maybe I missed something in this post. https://github.com/rolandleth/LTHPasscodeViewController/issues/16
Any ideas? Except creating manual references to every alertView
and actionSheet
inside my app, because I'm trying to find a fix for the passcode library, not my own apps; I can find dirty workarounds for that, no problem :)
Update: The window is _UIAlertOverlayWindow
if an actionSheet
is used instead of an alertView
, but it behaves the same as far as I can tell.
The simplest solution is to have a lockscreen window instead of a lockscreen view.
Create a new UIWindow
, set its frame to UIScreen
bounds, put a simple rootViewController
there that should handle rotation and display your "lock screen" views and set the windowLevel
to UIWindowLevelAlert + 1
.
Then set window's hidden
to YES
. Whenewer you want to show the lockscreen, just set hidden
to NO
.
I guess that adding a view to keyWindow
also doesn't work when a popover/action sheet is displayed and also when a keyboard is displayed (keyboard has its own window on top of the key window).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With