在以编程方式设置时,方向很奇怪

问题描述 投票:-1回答:1

我有设备方向的问题。我有一个UITabBarController,我需要所有标签为纵向,除了1个需要为LandscapeRight的标签。我让它部分工作,但考虑到这种情况,事情变得混乱:

目标:从纵向更改为横向(使用更改UITabBar选项卡的按钮。

工作原理:将屏幕保持在纵向状态,然后按更改标签的按钮。一旦出现新屏幕,这会将方向更改为横向。

不起作用:保持屏幕在横向上,同时仍在纵向屏幕中。现在点击更改选项卡的按钮,结果是屏幕不旋转。

因此,如果您了解我的问题,取决于我的设备在物理上的方向(意味着用户在按下按钮之前如何握住它),结果会有所不同。

这些是我用来处理这种情况的相关代码片段:

UITabBarController

extension UITabBarController {

func portraitSelected() {
    AppDelegate.AppUtility.lockOrientation(UIInterfaceOrientationMask.portrait, andRotateTo: UIInterfaceOrientation.portrait)

}
func landscapeSelected() {
    AppDelegate.AppUtility.lockOrientation(UIInterfaceOrientationMask.landscapeRight, andRotateTo: UIInterfaceOrientation.landscapeRight)

}
override open var shouldAutorotate: Bool {
    get {
        return true
    }
}


override open var supportedInterfaceOrientations: UIInterfaceOrientationMask{
    get {
            return self.selectedViewController?.supportedInterfaceOrientations ?? .portrait

        }
    }
}

在纵向视图控制器中,我有以下代码:

override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    return .portrait
}

override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        if let tabBar = self.tabBarController {
            tabBar.portraitSelected()
        }
    }

在横向视图控制器中:

override var supportedInterfaceOrientations: 
    UIInterfaceOrientationMask {
        return .landscapeRight
    }

override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
if let tabBar = self.tabBarController {
    tabBar.landscapeSelected()
}

}

最后,在AppDelegate中我添加了这些静态函数(在上面的代码中调用)

var orientationLock = UIInterfaceOrientationMask.portrait

struct AppUtility {
    static func lockOrientation(_ orientation: UIInterfaceOrientationMask) {
        if let delegate = UIApplication.shared.delegate as? AppDelegate {
            delegate.orientationLock = orientation
        }
    }

    static func lockOrientation(_ orientation: UIInterfaceOrientationMask, andRotateTo rotateOrientation:UIInterfaceOrientation) {
        self.lockOrientation(orientation)
        if rotateOrientation.isPortrait {
            print("portrait")
        } else if rotateOrientation.isLandscape {
            print("landscape")
        }
        UIDevice.current.setValue(rotateOrientation.rawValue, forKey: "orientation")
    }
}

在构建设置中,我将portrait和landscapeRight设置为我支持的方向。

我已经搜索了我能找到的与此相关的每个帖子,没有解决我的问题。

swift uitabbarcontroller uiinterfaceorientation
1个回答
0
投票

最终我通过移除UIViewController之外的景观UITabBarController解决了这个问题。我现在只是在点击横向/纵向时来回更改应用程序的根视图控制器:

@IBAction func landscapeTapped(_ sender: Any) {
    let story = UIStoryboard.init(name: "Main", bundle: nil)
    let land = story.instantiateViewController(withIdentifier: "landscape") as! LanscapeViewController
    let window = UIApplication.shared.delegate as! AppDelegate
    window.window?.rootViewController = land
}

这避免了方向问题。

© www.soinside.com 2019 - 2024. All rights reserved.