ZenLayout 0.3

ZenLayout 0.3

测试已测试
Lang语言 SwiftSwift
许可证 MIT
发布最后发布2015年9月
SPM支持SPM

Andrey Ufimtsev维护。



  • By
  • Andrey Ufimtsev

ZenLayout

如果您曾经编写过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(),并且有不同的参数集来定义该方法做什么。

重要的是要记住两点

  1. layout() 方法生成的所有约束都被添加到该方法调用的视图上。
  2. 作为 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"

为什么选择 ZenLayout 呢?

原因 1:它是简洁易懂的。 您不再需要编写大量代码来设置视图的宽度和高度。而且,当您在长时间假期后打开代码时,会非常容易看出代码中正在发生什么。

是的,有点那样... 但有很多库允许您做同样的事情。

原因 2:您无需学习任何新内容就可以开始使用它。 就这些。这些约束与您以前使用的完全相同。只是风格不同。您无需记住任何复杂的方法。它非常直接。

但我想要那些复杂的方法!我想要通过只写一行代码来为多个视图设置约束!

原因 3:便捷的方法。 确实,拥有这样的工具集在手中很好。ZenLayout 提供了一个,但绝不会强迫您使用它,除非您感到舒适。

支持

如果您有建议或发现了一个错误,请随时发送邮件到 [email protected]。如果您的项目中使用了 ZenLayout,我也会很乐意知道。祝好!

许可证

ZenLayout 可在 MIT 许可下获得。有关更多信息,请参阅 LICENSE 文件。