IPadOS 26 не может установить разные ориентации в разных виртуальных машинах (работало на iPadOS 18 и работало на iPhoneIOS

Программируем под IOS
Ответить
Anonymous
 IPadOS 26 не может установить разные ориентации в разных виртуальных машинах (работало на iPadOS 18 и работало на iPhone

Сообщение Anonymous »

У меня есть домашний виртуальный компьютер, который должен быть книжным, затем он может запустить игровой виртуальный компьютер, который является альбомным. Мне нужно заставить интерфейс поворачиваться в альбомную ориентацию при нажатии игрового виртуального экрана, а затем поворачиваться обратно в портретное положение при возвращении на домашний виртуальный компьютер (я открыт для других потоков пользовательского интерфейса, пока игровой виртуальный компьютер находится в альбомной ориентации, поэтому гироскоп работает).
Ранее я мог добиться этого с помощью:

Код: Выделить всё

class AppDelegate {

public var orientationLock: UIInterfaceOrientationMask = .all
public func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
return orientationLock
}
}

public enum ScreenUtil {
public static func forceOrientation(_ mask: UIInterfaceOrientationMask) {
let delegate = UIApplication.shared.delegate as! AppAppDelegate
delegate.orientationLock = mask
windowScene?.requestGeometryUpdate(.iOS(interfaceOrientations: mask))
NAV_VC?.setNeedsUpdateOfSupportedInterfaceOrientations()
}
}
Тогда в моем контроллере представления:

Код: Выделить всё

open class MyVC: UIViewController {
private let supportedOrientationGetter: () -> UIInterfaceOrientationMask

open override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
ScreenUtil.forceOrientation(supportedOrientationGetter())
}
}
И затем подкласс MyVC решит, в какой ориентации должен быть экран.
Обратите внимание, что для этого кода требуется флаг UIRequiresFullScreen = YES в Info.plist, а также ориентация интерфейса в Info.plist содержит только .portrait, который является фиктивным значением. Фактическая ориентация задается в приведенном выше коде.
Этот код работал хорошо раньше, но не работает в iPadOS 26 (iPhone все еще работает). Также UIRequiresFullScreen устарел, поэтому его все равно хотелось бы удалить. И когда я удалил UIRequiresFullScreen, я получил предупреждение о том, что я должен поддерживать все ориентации на iPad, поэтому правильная настройка в iPadOS 26:
  • UIRequiresFullScreen = NO (потому что она устарела)
  • Поддерживаемые ориентации интерфейса содержат все (поскольку предупреждение обсуждалось выше)
Я выполнил инструкции из примечания об устаревании UIRequiresFullScreen. Это то, что я пробовал использовать API-интерфейс PrepresInterfaceOrientationLocked и supportInterfaceOrientations, но это не сработало.
В приведенном ниже примере у меня есть класс ViewController, который должен быть портретным, затем он перемещается в класс LandscapeVC, который должен быть ландшафтным.

Код: Выделить всё

import UIKit

class ViewController: UIViewController {

override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
return .portrait
}

override var prefersInterfaceOrientationLocked: Bool {
true
}

override func viewDidLoad() {
super.viewDidLoad()

navigationItem.title = "Hello"

let item = UIBarButtonItem(barButtonSystemItem: .action, target: self, action: #selector(clicked))
navigationItem.rightBarButtonItem = item
}

@objc
func clicked() {
let vc = LandscapeVC()
self.navigationController!.pushViewController(vc, animated: true)
}
}

class LandscapeVC: UIViewController {

override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
return .landscape
}

override var prefersInterfaceOrientationLocked: Bool {
true
}

}
А также некоторый дополнительный контекст о том, почему мне нужен пейзаж для этого конкретного экрана — потому что это пейзажная мини-игра, в которой используется гироскоп. В остальной части приложения работает любая ориентация, но для этой мини-игры мне нужно зафиксировать альбомную ориентацию.
В документе Apple по миграции также описана «автомобильная» игра, в которой используется гироскоп, так что это определенно возможно. Я открыт для других потоков пользовательского интерфейса (например, представить мини-игру VC или создать новое окно для мини-игры или что-то еще, если ориентация заблокирована в альбомной ориентации, чтобы гироскоп работал)
Примечание: я видел это еще один вопрос, но он не работает на iPadOS 26, в котором есть поддержка сцен.

Подробнее здесь: https://stackoverflow.com/questions/798 ... -on-ipados
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»