SwiftUI Force Portrait на все, кроме одного просмотра - PullRequest
2 голосов
/ 07 января 2020

У меня есть проект SwiftUI. Для всех видов, кроме одного, я хочу разрешить портретный и только портретный режим. Только для одного вида я хочу разрешить как портрет, так и пейзаж. Есть некоторые ресурсы на Swift, но я не смог найти их на SwiftUI.

Кто-нибудь нашел способ выполнить sh это?

Ответы [ 2 ]

2 голосов
/ 07 января 2020

Я должен был сделать что-то похожее на это. Вот наш подход.

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

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

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()

Надеюсь, это поможет!

0 голосов
/ 18 апреля 2020

Несколько твиков к ответу выше:

В AppDelegate как ответ Джонатана выше:

static var orientationLock = 
UIInterfaceOrientationMask.portrait

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

Затем в 'destinationView' - тот, который является пейзажем:

import SwiftUI

struct DestinationView: View {

var body: some View {
    Group {

        Text("Hello")

    }.onAppear {
        AppDelegate.orientationLock = UIInterfaceOrientationMask.landscapeLeft
        UIDevice.current.setValue(UIInterfaceOrientation.landscapeLeft.rawValue, forKey: "orientation")
        UINavigationController.attemptRotationToDeviceOrientation()
    }
    .onDisappear {
        DispatchQueue.main.async {
            AppDelegate.orientationLock = UIInterfaceOrientationMask.portrait
            UIDevice.current.setValue(UIInterfaceOrientation.portrait.rawValue, forKey: "orientation")
            UINavigationController.attemptRotationToDeviceOrientation()
        }
    }
}
}

Обратите внимание на .rawValue в строке UIDevice, которая избавляет от ошибки «LongValue». Кроме того, в .onDisappear мне пришлось использовать DispatchQueue.main.asyn c, чтобы избежать ошибки при возврате к предыдущему виду, который находится в портретной ориентации.

...