Форсировать альбомную ориентацию в одном окне - PullRequest
0 голосов
/ 19 марта 2020

В моем приложении все виды принудительно устанавливаются в книжную ориентацию через info.plist.

Исключением должен быть "MyView", который всегда должен быть в альбомной ориентации.

Что я сделал после съемки более глубокий взгляд на SO:

Добавлено в AppDelegate.swift:

static var orientationLock = UIInterfaceOrientationMask.portrait 

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

MyView.swift

struct MyView: View {
var body: some View {
    ZStack {
        // ...Some Images, etc.
    }
    .onAppear(perform: orientationLandscape)
    .onDisappear(perform: orientationPortrait)
}

func orientationLandscape() {
    AppDelegate.orientationLock = UIInterfaceOrientationMask.landscapeRight
    UIDevice.current.setValue(UIInterfaceOrientation.landscapeRight, forKey: "orientation")
    UINavigationController.attemptRotationToDeviceOrientation()
}

func orientationPortrait() {
    AppDelegate.orientationLock = UIInterfaceOrientationMask.portrait
    UIDevice.current.setValue(UIInterfaceOrientation.portrait, forKey: "orientation")
    UINavigationController.attemptRotationToDeviceOrientation()
}

}

UIDevice.current.setValue выдает ошибку. Без этой линии я могу вручную изменить ориентацию в MyView, удерживая устройство в альбомной / книжной ориентации, но оно должно автоматически переключаться при открытии и закрытии просмотра.

Ответы [ 2 ]

0 голосов
/ 22 марта 2020

Я решил это, ориентируясь на bmjohns answer на похожий вопрос:

  1. Добавьте код в AppDelegate (эта часть у меня уже была)
  2. Make структура и веселье c, которое выполняет эту работу (потребовались небольшие корректировки для XCode 11 и SwiftUI)
  3. Выполните забаву c onAppear вашего View
0 голосов
/ 19 марта 2020

есть способ принудительной альбомной ориентации

Введите код в viewDidLoad()

let value = UIInterfaceOrientation.landscapeLeft.rawValue
UIDevice.current.setValue(value, forKey: "orientation")

, а также,

override var shouldAutorotate: Bool {
    return true
}

для SwiftUI

Мы устанавливаем ориентацию проекта так, чтобы она поддерживала только портретный режим.

Затем в свой AppDelegate добавьте переменную экземпляра для ориентации и согласуйте с методом делегата supportInterfaceOrientationsFor.

static var orientationLock = UIInterfaceOrientationMask.portrait

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

Затем, когда вы собираетесь представить свой ландшафтный вид, выполните следующие действия:

AppDelegate.orientationLock = UIInterfaceOrientationMask.landscapeLeft
UIDevice.current.setValue(UIInterfaceOrientation.landscapeLeft, forKey: "orientation")
UINavigationController.attemptRotationToDeviceOrientation()

И при увольнении

AppDelegate.orientationLock = UIInterfaceOrientationMask.portrait
UIDevice.current.setValue(UIInterfaceOrientation.portrait, forKey: "orientation")
UINavigationController.attemptRotationToDeviceOrientation()

Надеюсь, это поможет вам ...:)

...