NiceLayout 0.0.1

NiceLayout 0.0.1

Adam Shin 维护。



  • Adam Shin

NiceLayout

NiceLayout 为代码中设置 Auto Layout 约束提供了一种简洁流畅的接口。它在系统布局约束 API 的基础上构建,可以轻松集成到现有项目中。

// Before
myView.addSubview(button)
button.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
    button.leadingAnchor.constraint(equalTo: myView.leadingAnchor, constant: 16),
    button.trailingAnchor.constraint(equalTo: myView.trailingAnchor, constant: -16),
    button.topAnchor.constraint(equalTo: label.bottomAnchor),
    button.heightAnchor.constraint(equalToConstant: 44)
])

// After
myView.addSubview(button)
button.pin(.hEdges).to(.super).inset(16)
button.pin(.top).to(label, .bottom)
button.pin(.height).to(44)

使用方法

添加约束

添加约束的表达式基本形式为 view.pin(...).to(...)

view1.pin(.leading).to(view2, .trailing)

view1.pin(.width).to(120)

当相同的锚点用于两个视图时,可以在 to(...) 调用中省略。

view1.pin(.leading).to(view2, .leading)
view1.pin(.leading).to(view2)

要设置约束的常量,请在后面附加一个 offset(...) 调用。

view1.pin(.leading).to(view2).offset(16)

inset(...) 方法与 offset(...) 的作用相同,但它翻转了 trailing 和 bottom 边缘常量的符号,以便边缘总是向内偏移。

view1.pin(.trailing).to(view2).offset(-16)
view1.pin(.trailing).to(view2).inset(16)

还可以使用复合锚点来同时设置多个约束。

view1.pin(.center).to(view2)

view1.pin(.edges).to(view2).inset(16)

view1.pin(.size).to(width: 60, height: 80)

NiceLayout 会自动将表达式的左侧视图的 translatesAutoresizingMaskIntoConstraints 设置为 false。

父视图约束

当将视图约束到其父视图时,可以使用简写值 .super 作为目标。

labelContainerView.addSubview(label)
label.pin(.leading).to(.super)
label.pin(.centerY).to(.super)

视图还可以约束到其父视图的安全区域或布局边距。

view.addSubview(textView)
textView.pin(.top).to(.safeArea)
textView.pin(.hEdges).to(.margins)

约束选项

可以通过额外的方法调用设置约束的倍数、优先级和关系。

view1.pin(.width).to(view2).multiplier(0.5)

view1.pin(.height).to(600).priority(250)

view1.pin(.bottom).to(view2).inset(24).relation(.lessOrEqual)

访问原始 NSLayoutConstraints

要访问由 NiceLayout 创建的底层 NSLayoutConstraints,请使用约束表达式上的 constraintconstraints 属性。然后可以像通常一样更新或停用这些约束。

let widthConstraint: NSLayoutConstraint = view1.pin(.width).to(120).constraint

let edgeConstraints: [NSLayoutConstraint] = view1.pin(.edges).to(view2).constraints