在Swift

时间:2015-05-21 19:12:01

标签: ios swift uiviewcontroller uinavigationcontroller

我的应用程序中有一个用户设置,它应该将特定视图控制器的方向设置为横向或纵向。用户通过设置应由其他控制器读取的全局变量来按下主屏幕上的按钮以切换应用程序中其他视图控制器的横向/纵向。

我已按如下方式扩展了UINavigationController:

extension UINavigationController {
  public override func supportedInterfaceOrientations() -> Int {
    return visibleViewController.supportedInterfaceOrientations()
  }
}

我也尝试过将visibleViewController更改为topViewController而没有运气。

在我的所有UIViewController文件中,我都覆盖了函数:

override func supportedInterfaceOrientations() -> Int {
  return appOrientation // global user setting
}

问题是,调用此函数的唯一视图控制器是主视图控制器(用户看到的第一个视图以及用户可以选择方向的位置)。为什么在随后推送的视图控制器中不调用此函数?

当用户切换时,全局appOrientation变量设置为以下任一项:

let orientationPortrait = Int(UIInterfaceOrientationMask.Portrait.rawValue | UIInterfaceOrientationMask.PortraitUpsideDown.rawValue)
let orientationLandscape = Int(UIInterfaceOrientationMask.Landscape.rawValue)

如果我在主视图控制器的supportedInterfaceOrientation函数中返回其中一个定义,整个应用程序将面向定义(不是我想要的)。

我必须在这里遗漏一些东西。

1 个答案:

答案 0 :(得分:1)

我想我有一个解决方案。我不知道我是否完全掌握了这个问题,但是我在主视图上设置了一个按钮(这是为了模拟你的设置页面)我创建了一个名为press的变量,当按下按钮时,添加了1按下,再次按下按钮时,从按下中减去1。 (按下按钮时我也更改了按钮的名称,因为我喜欢OCD)。

然后在下一个视图中,我在viewwillappear函数中创建了一个if语句。我询问按下是否等于1,设置方向横向,如果按下等于2,则将方向设置为纵向。我添加了一个导航栏,因此您可以来回尝试两种方向。我确保将主视图的方向设置为纵向,因为您设置了整个设备方向,因此如果您只是前进并且新视图是横向的,那么当您返回时主视图也将是横向。 / p>

无论如何,我已经为您构建了一个快速项目,这里有GitHub链接:https://github.com/dombryan94/SetOrientationOfOtherViews

如果这是您正在寻找的,请告诉我,我希望这会有所帮助!