Я следовал инструкциям из примечания об устаревании 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
}
}
Также некоторый дополнительный контекст о том, почему мне нужен пейзаж для этого конкретного экрана — потому что это пейзажная мини-игра, в которой используется гироскоп. В остальной части приложения работает любая ориентация, но для этой мини-игры мне придется зафиксировать альбомную ориентацию.
Обновление:
То, что я хочу, определенно выполнимо до 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())
}
}
И тогда подкласс MyVC решит, в какой ориентации должен быть экран.
Учитывая, что UIRequiresFullScreen устарел, мне нужно найти другие способы.>
Подробнее здесь: https://stackoverflow.com/questions/798 ... ontrollers
Мобильная версия