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 种可能的选择。然后,我希望一些UIViewController
s 可以旋转到横向,而我还希望其他一些UIViewController
s 只有横向模式。所以我写了这个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
分配给所有UINavigationController
s,而我已将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