Запуск или задержка автоповорота в iOS 7

Можно ли каким-либо образом задержать или запустить автоматическое вращение в iOS 7 без переключения на новый контроллер представления?

Рассмотрим пример Siri на iPad. Когда Siri активируется, приложение, работающее за ним, откладывается и размывается прозрачным интерфейсом Siri, наложенным поверх. Если вы поворачиваете устройство во время использования Siri, ничего не происходит, но после закрытия Siri, наконец, срабатывает событие автоматического поворота.

Я выполняю аналогичный эффект размытия/отсрочки в своем приложении, делая снимок окна, размывая/масштабируя его, помещая его поверх отображаемого представления и размещая сверху дополнительный прозрачный контент. Поскольку это снимок и не может изменять размер на лету, я предотвращаю автоматическое вращение (как Siri) с помощью -shouldAutorotate, возвращающего НЕТ наверху в иерархии представлений. Как только это состояние отменяется, я снова разрешаю автоматический поворот, но поворот не запускается. Это связано с тем, что вращение, которое произошло, когда приложение находилось в этом режиме размытия/отсрочки, было проигнорировано.

Можно ли запустить автоповорот, чтобы правильно повернуть устройство в фактическую ориентацию после выхода из этого режима?


person cky880    schedule 31.01.2014    source источник


Ответы (2)


Вот три моих предложения:

  1. Используйте живое размытие и разрешите анимацию. Существует множество реализаций с открытым исходным кодом, в большинстве из которых используется растянутая панель инструментов или ее размытие CALayer. Это позволит вам поддерживать вращение, а также иметь возможность просмотра в реальном времени на размытом фоне (например, Siri). Редактировать: Покопавшись, я обнаружил, что некоторые реализации с открытым исходным кодом, которые занимали CALayer панели инструментов, были отклонены Apple. Взяв панель инструментов и растянув, это кажется безопасным.

  2. После создания снимка ключевого окна отобразите этот снимок как корневой представление другого окна, которое отображается над ключевым окном. Если я правильно помню, одно только представление без подключенного контроллера представления не будет вращаться при добавлении в иерархию представлений окна. (Если это так, то это очень легко противодействовать с помощью встречного преобразования.) По сути, вы получите невращающийся вид. Однако окно ниже будет вращаться как обычно. При закрытии окна хранения моментального снимка уменьшите его яркость, чтобы иерархия представлений ниже была плавно представлена ​​пользователю. Недостатки такого подхода — нет живого предварительного просмотра размытого фона, анимация поворота не будет видна пользователю.

  3. Вращение в iOS — это в основном контроллер представления, устанавливающий преобразование для представления, если все условия соблюдены и определено, что поворот интерфейса поддерживается. В контроллере представления, отвечающем за размытое представление, встречное вращение с инвертированными преобразованиями. Это должно заставить виды выглядеть так, как будто они не вращаются. Когда придет время скрыть размытое изображение, используйте блок анимации, чтобы сбросить преобразование, которое создаст ту же анимацию, что и вращение. Если вы объедините этот подход с просмотром размытия в реальном времени, это воссоздаст родной опыт Siri 1: 1. Ваша единственная проблема будет заключаться в том, что строка состояния будет вращаться независимо от преобразования представления, потому что оно получает преобразование из другой системы. Для этого есть серые средства.

Эти рекомендации отсортированы по простоте реализации. Каждый может быть реализован сам по себе или в комбинации 1+2, 1+3 или 1+2+3.

person Leo Natan    schedule 31.01.2014
comment
Вы правы в том, что вид, не прикрепленный к контроллеру, не вращается при добавлении в качестве подвида в окно (часть № 2). Это было достаточно просто, чтобы достичь того, что я хотел, с добавленными шагами обеспечения программного поворота снимка путем установки его преобразования в соответствии с текущей ориентацией устройства, когда начинается переход в режим размытия. Простое перекрестное затухание при выходе из режима размытия достаточно сглаживает переход, чтобы он не выглядел резким, что я делаю условно, основываясь на том, изменилась ли ориентация перед выходом из этого режима. Спасибо. - person cky880; 03.02.2014

Siri следует другим правилам. Это совершенно другое приложение (и привилегированное системное приложение), которое отображается поверх предыдущего приложения.

Что касается вашей ситуации, то, вероятно, нужно представить полноэкранный контроллер модального представления поверх текущего контроллера представления, который допускает только текущую ориентацию. Затем, когда он будет отклонен, предыдущий VC снова разрешит ротацию, и все должно продолжиться с того места, где оно было остановлено.

person Duncan C    schedule 31.01.2014