IPadOS 26, как установить разную ориентацию в разных контроллерах представленияIOS

Программируем под IOS
Ответить
Anonymous
 IPadOS 26, как установить разную ориентацию в разных контроллерах представления

Сообщение Anonymous »

У меня есть домашний виртуальный компьютер, который должен быть в книжной ориентации, тогда он может запустить игровой виртуальный компьютер в альбомной ориентации. Интересно, как я могу заставить интерфейс поворачиваться в альбомную ориентацию при нажатии на виртуальный компьютер игры, а затем поворачиваться обратно в портретную ориентацию при возвращении в домашний виртуальный компьютер?
Я следовал инструкциям из примечания об устаревании UIRequiresFullScreen: https://developer.apple.com/documentati ... FullScreen. Это то, что я пытался использовать 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
}

}
Обновление: я видел, что поддерживаемые ориентации интерфейса не работают, но они не работают в iPadOS 26, в которой есть поддержка сцен.
Также некоторый дополнительный контекст о том, почему мне нужен пейзаж для этого конкретного экрана — потому что это пейзажная мини-игра, в которой используется гироскоп. В остальной части приложения работает любая ориентация, но для этой мини-игры мне придется зафиксировать альбомную ориентацию.
Обновление:
То, что я хочу, определенно выполнимо до iOS 26, потому что я делаю это уже несколько лет. Вот что я сделал, и это сработало на iOS 18:

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

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())
}
}
Для этого кода требуется флаг UIRequiresFullScreen = YES в Info.plist.
И тогда подкласс MyVC решит, в какой ориентации должен быть экран.
Учитывая, что UIRequiresFullScreen устарел, мне нужно найти другие способы.>

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

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

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

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

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

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