为什么我喜欢SnapKit,您也可以

刚开始编码时,我100%参与StoryBoard团队。 很容易看到不同的UIView是如何交互的,您可以将它们精确地放置在所需的位置。 这适用于单个屏幕尺寸,但是随着视图变得越来越复杂并且需要适应各种屏幕尺寸,约束的层次结构变得越来越难以确定。

尽管如此,程序化还是令人恐惧! Swift的内置方法是噩梦。 即使我现在已经全心全意地通过程序设计应用程序,但仅查看这些方法仍然会让我感到恐惧。 幸运的是,令许多程序员感到宽慰的是,SnapKit幸运的灵魂为iOS和OS X设计了一个完全用Swift编写的疯狂简单的自动布局DSL!

首先,只需在pod文件中使用pod 'SnapKit'安装SnapKit CocoaPod,然后打开项目的.xcworkspace。 以编程方式设计应用程序需要一些设置。 首先转到您应用的“常规设置”,然后在“部署信息”的“主界面”下,删除“ Main所在的位置。 这告诉您的应用不再担心故事板!

尽管如此,应用程序仍需要一个切入点……这就是AppDelegate发挥作用的地方。 在这里,您要声明第一个ViewController的实例。 (如果您使用的是UINavigationController,UITabBarController或ContainerViewController,则也可以在其中进行设置,但现在我们将使用单个ViewController)。 在AppDelegate的func application(... didFinishLaunchingWithOptions...)方法中,将window初始化为具有与UIScreen绑定的框架相同的框架的UIWindow() ,然后初始化主ViewController。 接下来将window?.rootViewController设置为与您新创建的ViewController相等,并使该window可见!

五行代码,您的应用程序将打开您指定的ViewController。 现在,让我们来看看有趣的东西吧!

当然,第一步是导入SnapKit。 (如果它声称不存在这样的模块,请给它旧的Command + B;还要检查您是否在xcworkspace中工作,而不仅仅是xcodeproj)。 通常,我制作的第一个UIView会占据整个屏幕,因此让我们创建一个mainView: UIView!实例mainView: UIView! ,对其进行初始化,然后将其添加到ViewController的view将其设置为等于屏幕的大小。

mainView.snp.makeContraints方法中,每次您写入$0它只是简单地引用受约束的-view本身! 将边缘设置为equalToSuperview将允许此View扩展到其superView(UIScreen的view )所允许的最大范围。 这是一个简单的介绍,但让我们看看snp.makeConstraints还有哪些其他选项。

现在我们有了背景视图,让我们在可能要显示一些常规信息的地方添加标题。 此新视图将添加到mainView顶部,并将与Screen / SuperView的高度成比例:

请注意,如果属性有所不同,如何将不同的约束链接在一起,并添加新行。 这使得代码非常容易键入和阅读!

在这一点上,我们有一个mainView,大小为UIScreen的青色,还有一个headerView的彩色迷离,它覆盖了屏幕的前25%。 让我们添加一个Label并将其直接放置在headerView

使用UILabels,您不必将它们设置为特定的高度或宽度。 取决于您选择的文字和字体/大小。 这样,您只需给它一个X / Y轴位置,Xcode就会假定其余的位置。

最终结果应显示3/4青色和1/4蓝色屏幕,其中标签直接位于蓝色部分的中心。

SnapKit中提供了许多其他方法,其中大多数是完全不言自明的。 例如,如果我们希望mainLabel位于屏幕中央,但在蓝色headerView ,则可以删除centerY约束并添加新行,指示$0.top.equalTo(mainHeader.snp.bottom).offset(10) 。 这会将其固定在mainView下方,但略微在下方。

如您所见,SnapKit非常适合将视图划分为子视图的不同部分,这与Xib的行为类似。 我通常将所有约束放入一个方法中,并在所有视图初始化后调用它。 这有助于使已经可读的代码易于定位和测试。

我鼓励您探索并试用SnapKit方法包,以了解与使用其他较大文本块相比,实现这些约束有多简单。 我要说的一句话是,就像代码的许多方面一样,命令是按顺序链接的,这意味着如果您对尚未完全初始化或自身没有约束的目标设置约束,则应用程序可能会崩溃。 幸运的是,SnapKit包含有用的打印语句,通知您可能导致崩溃的原因!

我希望该博客有助于减轻与程序布局有关的恐惧,并鼓励您使用一个奇妙且维护良好的存储库! 在我的下一篇博文中,我将向您展示如何使用这些程序约束来仅使用UIStackViews创建模仿UICollectionView。 在此之前,祝您编程愉快!