2013-11-06 3 views
5

Я создал iOS 7 passcode replica, и у меня есть эта проблема, которую я не могу решить. Мне нужно, чтобы экран блокировки отображался поверх всего остального, поэтому приложение покрывается многозадачным представлением iOS, поэтому я добавляю его непосредственно в keyWindow. Пока все хорошо.UIAlertViews, UIActionSheets и keyWindow проблемы

Проблема возникает, если есть alertView или actionSheet (упомяну лишь alertView с в этом сообщении, чтобы сохранить его простым) открытым, когда я должен отобразить экран блокировки. Несколько раз ответили, что нет ссылок на alertView s в iOS 7, что верно, и окно, в котором они отображаются, составляет _UIModalItemHostingWindow, которое имеет 2 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 внутри моего приложения, потому что я пытаюсь найти исправление для библиотеки паролей, а не для моих собственных приложений; Я могу найти грязные обходные пути для этого, нет проблем :)

Update: Окно _UIAlertOverlayWindow если actionSheet используется вместо alertView, но он ведет себя так же, насколько я могу судить.

+0

для случая UIActionSheet, его окно _UIAlertOverlayWindow доступно в [UIApplication sharedApplication] .windows, так что вы можете решить проблему с таблицей действий. Я тоже не получаю, как разрешить случай alertview –

ответ

2

Простейшим решением является наличие окна блокировки, а не экрана блокировки экрана.

Создать новую UIWindow, установите его в рамку UIScreen рамки, поставить простой rootViewController там должен обрабатывать вращение и отображать «блокировки экрана» взгляды и установить windowLevel в UIWindowLevelAlert + 1.

Затем установите hidden на YES. Когда вы хотите показать блокировку экрана, просто установите hidden в NO.

Я думаю, что добавление вида keyWindow также не работает, когда отображается панель popover/action, а также когда отображается клавиатура (клавиатура имеет собственное окно поверх окна ключа).

+0

Я уже пробовал создать новый UIWindow и установить его уровень до 1997 ('UIWindowLevelAlert + 1'), а значение действительно 1997, но все же окно с' alertView' появляется сверху. Он снова запускает анимацию обжига, когда возвращается на передний план. Добавление представления в 'keyWindow' создает проблему, которую я описал, не добавляя перед тем, как идти в фоновый режим, а не отображаться в представлении многозадачности и отображаться после выхода с переднего плана с довольно большой задержкой после анимации' alertView'. – Roland

+0

Хмм, я явно делал что-то неправильно раньше, так как теперь я снова попытался создать новый UIWindow и появился над 'actionSheet'. Хм, не то, что это имеет значение, но мне интересно, что я сделал раньше. Возвращаясь к окончательным результатам, поскольку я должен уехать сейчас. – Roland

+0

Ну, это смешно. Этот подход работает, но у него есть эта проблема: если при переходе на задний план не отображается «actionSheet» или «alertView», он корректно работает при возврате (включая показ клавиатуры). Если один из них присутствует при переходе на задний план, при возвращении окно отображается правильно над всем, но клавиатура не отображается. Никакой другой разницы, кроме наличия 'alertView' /' actionSheet'. – Roland

Смежные вопросы