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]
}
Другие вопросы по тегам