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
,请使用约束表达式上的 constraint
或 constraints
属性。然后可以像通常一样更新或停用这些约束。
let widthConstraint: NSLayoutConstraint = view1.pin(.width).to(120).constraint
let edgeConstraints: [NSLayoutConstraint] = view1.pin(.edges).to(view2).constraints