ios SwiftUI在除一个视图之外的所有视图上强制纵向

olmpazwi  于 2023-01-14  发布在  iOS
关注(0)|答案(6)|浏览(158)

我有一个SwiftUI项目。除了一个视图之外,我希望所有视图都允许纵向和仅纵向模式。对于仅一个视图,我希望允许纵向和横向模式。Swift上有一些资源,但我在SwiftUI上找不到任何资源。
有没有人找到一种方法来实现这一点?

juzqafwq

juzqafwq1#

我不得不做一些类似的事情。这是我们的方法。
我们将项目方向设置为仅支持纵向模式。
然后在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()

希望这有帮助!

6uxekuva

6uxekuva2#

对上面的答案进行一些调整:
在AppDelegate中,作为上面Jonathan的答案:

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

请注意UIDevice行中的.rawValue,它消除了“LongValue”错误。此外,在. onDisappearse中,我不得不使用DispatchQueue.main.async,以避免在返回到以前的纵向视图时出错。

mlmc2os5

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

qkf9rpyu

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

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

qojgxg4l6#

为了给Jonathan的解决方案提供一个小小的改变,这个版本回答了上面的人们关于如何使用除了“landscape left”之外的其他方向的问题。
首先,Jonathan声明“我们将项目方向设置为仅支持纵向模式。”如果您希望允许其他方向,请不要这样做。因此,如果您也希望此方向,请为项目保留“纵向”、“左横向”和“右横向”以及“倒置”复选框。
其次,在希望允许旋转的视图的onAppear中,设置以下内容:
AppDelegate.orientationLock = UIInterfaceOrientationMask.allButUpsideDown
上面的代码替换了原始示例中的.landscapeLeft。注意,如果你想允许上下颠倒,就把它改为.all
就是这样。其他一切都是乔纳森和其他人所说的。结果是,除了你用onAppear更新的视图和上面的代码之外,应用程序将被纵向锁定。对于这些视图,用户将可以访问所有方向(或者除了倒置之外的所有方向)。

相关问题