我有一个SwiftUI项目。除了一个视图之外,我希望所有视图都允许纵向和仅纵向模式。对于仅一个视图,我希望允许纵向和横向模式。Swift上有一些资源,但我在SwiftUI上找不到任何资源。有没有人找到一种方法来实现这一点?
juzqafwq1#
我不得不做一些类似的事情。这是我们的方法。我们将项目方向设置为仅支持纵向模式。然后在AppDelegate中添加一个用于定向的示例变量,并遵循supportedInterfaceOrientationsFor委托方法。
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.rawValue, forKey: "orientation") UIViewController.attemptRotationToDeviceOrientation()
一旦被解雇,
AppDelegate.orientationLock = UIInterfaceOrientationMask.portrait UIDevice.current.setValue(UIInterfaceOrientation.portrait.rawValue, forKey: "orientation") UIViewController.attemptRotationToDeviceOrientation()
希望这有帮助!
6uxekuva2#
对上面的答案进行一些调整:在AppDelegate中,作为上面Jonathan的答案:
然后在“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() } } } }
请注意UIDevice行中的.rawValue,它消除了“LongValue”错误。此外,在. onDisappearse中,我不得不使用DispatchQueue.main.async,以避免在返回到以前的纵向视图时出错。
mlmc2os53#
如果您的应用使用SwiftUI生命周期,则应用将使用符合应用协议的自定义结构体启动。您的应用没有实现上述解决方案所需的AppDelegate。要创建您自己的AppDelegate,请在您的appnameApp.swift中尝试以下代码
@main struct appnameApp: App { @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate var body: some Scene { WindowGroup { ContentView() } } } class AppDelegate: NSObject, UIApplicationDelegate { static var orientationLock = UIInterfaceOrientationMask.portrait func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool { // something to do return true } func application(_ application: UIApplication, supportedInterfaceOrientationsFor window:UIWindow?) -> UIInterfaceOrientationMask { return AppDelegate.orientationLock } }
来源:https://www.hackingwithswift.com/quick-start/swiftui/how-to-add-an-appdelegate-to-a-swiftui-app
qkf9rpyu4#
另外,您还可以进一步使用Jonathan的代码为View类创建一个扩展,并在您想要旋转的类上调用此扩展。
extension View { func unlockRotation() -> some View { onAppear { AppDelegate.orientationLock = UIInterfaceOrientationMask.allButUpsideDown UIViewController.attemptRotationToDeviceOrientation() } .onDisappear { AppDelegate.orientationLock = UIInterfaceOrientationMask.portrait UIDevice.current.setValue(UIInterfaceOrientation.portrait.rawValue, forKey: "orientation") UIViewController.attemptRotationToDeviceOrientation() } } }
llew8vvj5#
使用https://stackoverflow.com/a/41811798/10330141中的应用实用程序在SwiftUI中创建自定义UIHostingController
class OrientationHostingController : UIHostingController<AnyView> { override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) AppUtility.lockOrientation(.portrait) } } let rootView = OrientationHostingController(rootView: AnyView(SwiftUIView()))
qojgxg4l6#
为了给Jonathan的解决方案提供一个小小的改变,这个版本回答了上面的人们关于如何使用除了“landscape left”之外的其他方向的问题。首先,Jonathan声明“我们将项目方向设置为仅支持纵向模式。”如果您希望允许其他方向,请不要这样做。因此,如果您也希望此方向,请为项目保留“纵向”、“左横向”和“右横向”以及“倒置”复选框。其次,在希望允许旋转的视图的onAppear中,设置以下内容:AppDelegate.orientationLock = UIInterfaceOrientationMask.allButUpsideDown上面的代码替换了原始示例中的.landscapeLeft。注意,如果你想允许上下颠倒,就把它改为.all。就是这样。其他一切都是乔纳森和其他人所说的。结果是,除了你用onAppear更新的视图和上面的代码之外,应用程序将被纵向锁定。对于这些视图,用户将可以访问所有方向(或者除了倒置之外的所有方向)。
onAppear
AppDelegate.orientationLock = UIInterfaceOrientationMask.allButUpsideDown
.landscapeLeft
.all
6条答案
按热度按时间juzqafwq1#
我不得不做一些类似的事情。这是我们的方法。
我们将项目方向设置为仅支持纵向模式。
然后在
AppDelegate
中添加一个用于定向的示例变量,并遵循supportedInterfaceOrientationsFor
委托方法。然后,当您要显示横向视图时,请执行以下操作:
一旦被解雇,
希望这有帮助!
6uxekuva2#
对上面的答案进行一些调整:
在AppDelegate中,作为上面Jonathan的答案:
然后在“destinationView”中-即横向视图中:
请注意UIDevice行中的.rawValue,它消除了“LongValue”错误。此外,在. onDisappearse中,我不得不使用DispatchQueue.main.async,以避免在返回到以前的纵向视图时出错。
mlmc2os53#
如果您的应用使用SwiftUI生命周期,则应用将使用符合应用协议的自定义结构体启动。您的应用没有实现上述解决方案所需的AppDelegate。
要创建您自己的AppDelegate,请在您的appnameApp.swift中尝试以下代码
来源:https://www.hackingwithswift.com/quick-start/swiftui/how-to-add-an-appdelegate-to-a-swiftui-app
qkf9rpyu4#
另外,您还可以进一步使用Jonathan的代码为View类创建一个扩展,并在您想要旋转的类上调用此扩展。
llew8vvj5#
使用https://stackoverflow.com/a/41811798/10330141中的应用实用程序
在SwiftUI中
创建自定义UIHostingController
qojgxg4l6#
为了给Jonathan的解决方案提供一个小小的改变,这个版本回答了上面的人们关于如何使用除了“landscape left”之外的其他方向的问题。
首先,Jonathan声明“我们将项目方向设置为仅支持纵向模式。”如果您希望允许其他方向,请不要这样做。因此,如果您也希望此方向,请为项目保留“纵向”、“左横向”和“右横向”以及“倒置”复选框。
其次,在希望允许旋转的视图的
onAppear
中,设置以下内容:AppDelegate.orientationLock = UIInterfaceOrientationMask.allButUpsideDown
上面的代码替换了原始示例中的
.landscapeLeft
。注意,如果你想允许上下颠倒,就把它改为.all
。就是这样。其他一切都是乔纳森和其他人所说的。结果是,除了你用
onAppear
更新的视图和上面的代码之外,应用程序将被纵向锁定。对于这些视图,用户将可以访问所有方向(或者除了倒置之外的所有方向)。