iOS 16 предотвращает вращение UIViewController
У меня есть UIViewController, который поддерживает все UIInterfaceOrientationMasks. Но в одном конкретном случае мне нужно предотвратить его вращение. До iOS 16 я просто обрабатывал этот случай следующим образом.
override var shouldAutorotate: Bool {
return !screenRecorderIsActive
}
И все работало нормально. После обновления до iOS 16 мой контроллер продолжает вращаться, и я не могу найти способ это исправить.
2 ответа
В моем случае мне нужно предотвратить автоматическое вращение не на основе определенной ориентации, а скорее на основе того, что вы делаете в приложении и какое оборудование имеет ваше устройство. И мне нужно продолжать поддерживать версии iOS вплоть до 9.3. Эти обновления заставили меня сделать следующее:
Новые функции недоступны в версии 9.3, поэтому мне нужно проверить, является ли версия iOS 16.x. Если это так, то мне пришлось реализовать supportInterfaceOrientations, чтобы текущая ориентация пользовательского интерфейса запрашивалась и возвращала TRUE только в том случае, если запрошенная ориентация совпадает с текущей ориентацией пользовательского интерфейса. Другими словами, не допускайте изменений.
Кроме того, поскольку как возврат из фона, так и повороты или события из других контроллеров представления могут изменить мой логический выбор, для которых разрешены ориентации, я должен был обязательно вызывать метод setNeedsUpdateOfSupportedInterfaceOrientations при возврате из фона или в любой другой раз, когда мне нужно было предотвратить Автоматический поворот.
Опять же, мне пришлось обернуть этот код проверками версии iOS. В конце концов мне пришлось реализовывать вещи по-старому для старых версий iOS.
Я был очень разочарован, что было введено такое кардинальное изменение. Да, эти методы уже давно устарели, но новые методы не вводились до версии 16.0 — и, что еще более важно, мой код делает разные вещи при использовании фронтальной камеры, которая теперь доступна на iPad 10, поэтому мне пришлось подождать. пока у меня в руках не было агрегата для раскрытия этих вопросов.
Цитата из примечаний к выпуску iOS 16 :
[UIViewController shouldAutorotate] устарел и больше не поддерживается. [UIViewController попыткаRotationToDeviceOrientation] устарела и заменена на [UIViewControllersetNeedsUpdateOfSupportedInterfaceOrientations].
Обходной путь: приложения, полагающиеся на shouldAutorotate, должны отражать свои предпочтения с помощью поддерживаемых контроллеров представленияInterfaceOrientations. Если поддерживаемые ориентации меняются, используйте `-[UIViewControllersetNeedsUpdateOfSupportedInterface
Чтобы реализовать динамически поддерживаемые ориентации интерфейса, вы можете использовать такой код:
var screenRecorderIsActive: Bool {
didSet {
setNeedsUpdateOfSupportedInterfaceOrientations()
}
}
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
if screenRecorderIsActive {
return [.landscape] // For example, or a variable representing the orientation when the condition was set
}
return [.all]
}