在iOS体系结构中使用合成

我最近更新了我的一个旧的github项目,该项目大约是四年前我刚开始进行iOS开发时创建的。 这是使用容器视图控制器的示例,特别是我正在研究视图控制器之间的转换。 在该项目中,三个子视图控制器包含在一个视图控制器中,它们周期性地以逆时针方向旋转。 这是一个非常简单且人为设计的视图控制器包含示例,只是为了帮助我了解这种技术的工作方式。

在重新审视视图控制器包含区时,我发现了一些最近的博客文章和会议讨论,内容涉及在iOS中使用容器视图控制器来帮助分离关注点并防止使用大量视图控制器。 像Dave DeLong,John Sundell和Paul Hudson这样的人。 与最初开始开发应用程序相比,这使我想到了最初的实现以及现在如何构建iOS应用程序。

iOS我们一直使用Apple的容器,形式为UINavigationControllerUITabBarControllerUIPageViewController UISplitViewController 。 自iOS 5以来,自定义容器视图控制器就已经存在,并且由Apple实施,部分目的是防止他们认为滥用了应用程序中的视图层次结构。 当来自一个视图控制器的视图被“剥离”并放置在另一个控制器的视图层次结构中时,就会发生这种情况。 这导致许多视图控制器的外观和旋转方法未被调用,从而导致意外行为和不良的用户体验。 苹果的演讲可以在这里找到:WWDC 2011 —会话102。该解决方案相当简单,因为所有UIViewController类都具有旨在添加和删除子控制器的方法。 实际上,添加或删除子视图控制器时需要调用几种方法,这些方法可以在Apple的iOS的《 View Controller编程指南》中找到。

布局

UIViewController的内容视图仅使用代码进行Auto Layout ,不使用InterfaceBuilder也不使用Auto Layout 。 我想在这个例子中尝试一些不同的东西,所以我选择只是将视图放在代码中。 这在更复杂的视图层次结构中具有一些挑战,但也具有一些优点。 缺点是可能涉及一些复杂的数学运算,因为您需要手动计算每个视图的位置和大小。 在这种简单的层次结构中,这相对容易一些,但是在更复杂的视图中,您可能需要将屏幕划分为多个部分,手动构建这些视图,然后将所有视图组合在一起。 组合是编程中最强大,最重要的概念之一。 从好的方面来说,这意味着布局更改相对容易处理,没有添加/删除或调整的限制。 我们重写viewWillLayoutSubviews 并计算视图的框架。 每当旋转设备时,都会再次调用此方法,并相应地调整视图框架,这非常好。

希望您喜欢这篇文章。 在构建应用程序时,请尝试将构图积极地融入设计中。 即使只是将状态属性分离成枚举,创建新的类型来保存方法参数,封装网络代码或将视图创建代码移到单独的类中的小步骤,也可以使您的应用程序更易于理解和维护。

最终项目可以在这里找到:ViewControllerContainment

资料来源

[1] Dave DeLong博客
[2] SwiftBySundell
[3]与Swift合作
[4]阴影图像
[5]图示8
[6] AppIconMaker

参考作者

如果您对本文中提到的任何作者感兴趣,可以在Twitter上关注他们,网址为:

戴夫·德隆( @ davedelong)
约翰·桑德尔(@johnsundell)
保罗·哈德森(@twostraws)
Soroush Khanlou(@khanlou)