我有设备方向的问题。我有一个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设置为我支持的方向。
我已经搜索了我能找到的与此相关的每个帖子,没有解决我的问题。
最终我通过移除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
}
这避免了方向问题。