【问题标题】:Swift: is it correct to assign a custom class to all UINavigationControllers?Swift:将自定义类分配给所有 UINavigationController 是否正确?
【发布时间】:2016-03-31 08:49:42
【问题描述】:

这或多或少是我Main.storyboard 的情况:

我有一个根 UITabBarController 有 5 种可能的选择。然后,我希望一些UIViewControllers 可以旋转到横向,而我还希望其他一些UIViewControllers 只有横向模式。所以我写了这个file.swift:

class CustomNavigationController: UINavigationController, UINavigationControllerDelegate {

  override func shouldAutorotate() -> Bool {
    if (self.topViewController?.isKindOfClass(HomeViewController) != nil) {return false}
    else if (self.topViewController?.isKindOfClass(ServicesViewController) != nil) {return false}
    else if (self.topViewController?.isKindOfClass(PhotoGalleryViewController) != nil) {return false}
    else if (self.topViewController?.isKindOfClass(SelectMapViewController) != nil) {return false}
    else if (self.topViewController?.isKindOfClass(MapViewController) != nil) {return false}
    else {return true}
  }

}

class CustomTabBarController: UITabBarController, UITabBarControllerDelegate {
  override func shouldAutorotate() -> Bool {
    return (self.selectedViewController as! UINavigationController).shouldAutorotate()
  }
}

我已将 CustomNavigationController 分配给所有UINavigationControllers,而我已将CustomTabBarController 分配给UITabBarController。 结果是没有视图控制器不旋转。这是因为我给他们分配了同一个班级吗?我应该为我拥有的每个UINavigationController 创建一个自定义导航控制器类吗?

更新

我发现的一个部分解决方案,即使它有点复杂,如下所示。我已经像这样修改了以前的文件:

class CustomNavigationController: UINavigationController, UINavigationControllerDelegate {

override func shouldAutorotate() -> Bool {
    return (self.topViewController?.shouldAutorotate())!
}

}

类 CustomTabBarController: UITabBarController, UITabBarControllerDelegate { 覆盖 func shouldAutorotate() -> Bool { return (self.selectedViewController as!UINavigationController).shouldAutorotate() } }

然后,在允许旋转的视图控制器中,我只需:

override func shouldAutorotate() -> Bool {
    return true
}

在视图控制器中不允许旋转我有:

override func shouldAutorotate() -> Bool {
    return false
}

override func viewWillAppear(animated: Bool) {
    let value = UIInterfaceOrientation.Portrait.rawValue
    UIDevice.currentDevice().setValue(value, forKey: "orientation")
}

总之有一点小问题,因为将模式设置为纵向的动画不正确,这意味着屏幕的宽度没有调整。如果我从横向视图控制器转到仅纵向视图控制器,则视图控制器框架不正确。我明白了

而不是这个:

【问题讨论】:

    标签: xcode swift uinavigationcontroller uitabbarcontroller autorotate


    【解决方案1】:

    在 AppDelegate 中试试这个

    func application(application: UIApplication, supportedInterfaceOrientationsForWindow window: UIWindow?) -> UIInterfaceOrientationMask {
        if let rootController = self.window?.rootViewController as? UITabBarController {
            if let navigationController = rootController.selectedViewController as? UINavigationController {
                let controller = navigationController.topViewController!
    
                if controller.isKindOfClass(HomeViewController.classForCoder()) {
                    return UIInterfaceOrientationMask.Portrait
                }
                if controller.isKindOfClass(ServicesViewController.classForCoder()) {
                    return UIInterfaceOrientationMask.Portrait
                }
                if controller.isKindOfClass(PhotoGalleryViewController.classForCoder()) {
                    return UIInterfaceOrientationMask.Portrait
                }
                if controller.isKindOfClass(SelectMapViewController.classForCoder()) {
                    return UIInterfaceOrientationMask.Portrait
                }
                if controller.isKindOfClass(MapViewController.classForCoder()) {
                    return UIInterfaceOrientationMask.Portrait
                }
            }
        }
        return UIInterfaceOrientationMask.All
    }
    

    更新:

    此方法强制应用程序更改 ViewController 中的方向,而 ViewController 中的方向应该只在 Portrait 中(HomeViewController、ServicesViewController、PhotoGalleryViewController、SelectMapViewController、MapViewController):

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        let value = UIInterfaceOrientation.Portrait.rawValue
        UIDevice.currentDevice().setValue(value, forKey: "orientation")
    }
    

    【讨论】:

    • 感谢您的建议,但恐怕它不起作用...它们都毫无例外地旋转:(
    • @LoryLory 抱歉,我已经编辑了我的答案。以前仅适用于 Presented 控制器。这个应该可以的。此外,即使没有 CustomNavigationController,它也可以工作。试试看;)
    • 好的,但现在我的问题更新中描述了问题:如果我从横向视图控制器转到仅纵向视图控制器,则视图控制器框架不正确。选择新图像。
    • @LoryLory 为此,您需要在 HomeViewController、ServicesViewController、PhotoGalleryViewController、SelectMapViewController、MapViewController 中再添加一行代码。查看答案
    • 您编写的代码与我在 viewWillAppear() 中添加的代码完全相同,但“转换”不正确......我得到的那个战略图像就像表格视图保持在横向模式一样。我也尝试过更新它的框架,但 id 没有改变
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多