Swift:将自定义类分配给所有 UINavigationController 是不是正确?

Posted

技术标签:

【中文标题】Swift:将自定义类分配给所有 UINavigationController 是不是正确?【英文标题】: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")

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

而不是这个:

【问题讨论】:

【参考方案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 没有改变

以上是关于Swift:将自定义类分配给所有 UINavigationController 是不是正确?的主要内容,如果未能解决你的问题,请参考以下文章

将自定义类分配给控制器后,Xcode Table View 被擦除

如何将自定义分配器的完全相同的状态传递给多个容器?

Angular - 将自定义验证器分配给 FormGroup

打字稿将自定义对象分配给任何对象

将自定义参数传递给 uibutton #selector swift 3

将自定义导航栏分配给 UINavigationController [重复]