如果您曾经编写过Auto Layout约束代码,您可能知道有时过程可能有多么痛苦。ZenLayout是一个非常小但非常智能的库,旨在简化布局相关编程,使其既方便又愉快。
ZenLayout仍在开发中,这意味着直到版本1.0.0之前,与先前版本ZenLayout的兼容性不能得到保证。如果您使用CocoaPods,请在Podfile中指定所需的版本。
该库的核心功能是简化的约束语法。让我们看看一些用于将一个label
放在一个button
下面的原生Cocoa Touch代码,并使它们的水平中心对齐。
label.setTranslatesAutoresizingMaskIntoConstraints(false)
view.addConstraint(NSLayoutConstraint(item: label,
attribute: .Top,
relatedBy: .Equal,
toItem: button,
attribute: .Bottom,
multiplier: 1,
constant: 15))
view.addConstraint(NSLayoutConstraint(item: label,
attribute: .CenterX,
relatedBy: .Equal,
toItem: button,
attribute: .CenterX,
multiplier: 1,
constant: 0))
现在,让我们看看用ZenLayout完成同样代码的样子
view.addConstraint(label.top == button.bottom + 15)
view.addConstraint(label.centerX == button.centerX)
令人印象深刻?那么让我们继续吧!
所以,正如您可能已经注意到的,ZenLayout允许我们把约束当作一个等式来处理,并以以下格式编写
view1.attribute == multiplier * view2.attribute + constant
这样的表达式会产生NSLayoutConstraint
类的一个对象,您可以将它存储在一个变量中或者直接放入到addConstraint()
方法中
let constraint = child.left == parent.left
parent.addConstraint(constraint)
// --- OR ---
parent.addConstraint(child.left == parent.left)
让我们练习一下,使从之前的示例中的一个label
的宽度是button
的两倍
view.addConstraint(label.height == 2 * button.height)
请注意,我们不需要写入setTranslatesAutoresizingMaskIntoConstraints(false)
,因为这个操作会自动应用于等式左侧的视图(在这个例子中是对label
)。
假设我们有一个使子视图的高度为父视图高度的一半减去4的约束,并且我们想要将其优先级设置为100。可以使用特殊的`!语法来设置
child.height == 0.5 * parent.height - 4 ! 100
除了更新的约束语法外,ZenLayout还提供了一些便利方法来处理更复杂的布局任务。每个这些方法都命名为layout()
,并且有不同的参数集来定义该方法做什么。
重要的是要记住两点
layout()
方法生成的所有约束都被添加到该方法调用的视图上。layout()
方法第一个参数传入的视图,其 translatesAutoresizingMaskIntoConstraints
属性被设置为 false
。匹配大小。 您可以通过调用 layout(_:matchSize:)
来设置视图的大小。
layout(view, matchSize: CGSize(width: 50, height: 50))
固定至中心。 您可以通过调用 layout(_:pinToCenterOf:)
将视图的中心固定到另一个视图的中心,或者通过调用 layout(_:pinToCenterOf:displacement:)
来指定从中心的位置偏移。
layout(child, pinToCenterOf: parent, displacement: CGVector(dx: 15, dy: 20))
固定至边缘。 您可以通过调用 layout(_:pinToEdgesOf:)
将视图的边缘固定到另一个视图的边缘,或者通过调用 layout(_:pinToEdgesOf:insets:)
来指定边距。
layout(child,
pinToEdgesOf: parent,
insets: UIEdgeInsets(top: 8, left: 8, bottom: 8, right: 8))
固定至边距。 您可以通过调用 layout(_:pinToMarginsOf:)
将视图的边缘固定到另一个视图的边距,或者通过调用 layout(_:pinToMarginsOf:insets:)
来指定边距。
layout(child,
pinToMarginsOf: parent,
insets: UIEdgeInsets(top: 8, left: 8, bottom: 8, right: 8))
更多即将到来! 确实,这还远未结束。
ZenLayout 通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile 中。
pod "ZenLayout"
原因 1:它是简洁易懂的。 您不再需要编写大量代码来设置视图的宽度和高度。而且,当您在长时间假期后打开代码时,会非常容易看出代码中正在发生什么。
是的,有点那样... 但有很多库允许您做同样的事情。
原因 2:您无需学习任何新内容就可以开始使用它。 就这些。这些约束与您以前使用的完全相同。只是风格不同。您无需记住任何复杂的方法。它非常直接。
但我想要那些复杂的方法!我想要通过只写一行代码来为多个视图设置约束!
原因 3:便捷的方法。 确实,拥有这样的工具集在手中很好。ZenLayout 提供了一个,但绝不会强迫您使用它,除非您感到舒适。
如果您有建议或发现了一个错误,请随时发送邮件到 [email protected]。如果您的项目中使用了 ZenLayout,我也会很乐意知道。祝好!
ZenLayout 可在 MIT 许可下获得。有关更多信息,请参阅 LICENSE 文件。