为什么我喜欢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。 在此之前,祝您编程愉快!