forEach 在 nslaoyutconstraints 中的使用
forEach use in nslaoyutconstraints
我想让我的 swift 代码看看在创建约束时是否可以使用类似于 for Each 循环的方法。现在代码无法编译。在正常设置中 $0 是 b4。如果我可以做这样的事情,如果我必须对多个对象执行此操作,那将使我的编码效率更高。
NSLayoutConstraint.activate([
[b4].forEach({
[=10=].topAnchor.constraint(equalTo: colorLbl.bottomAnchor),
[=10=].leadingAnchor.constraint(equalTo: b3.trailingAnchor),
[=10=].heightAnchor.constraint(equalTo: view.heightAnchor,multiplier: 0.10),
[=10=].widthAnchor.constraint(equalTo: view.widthAnchor,multiplier: 0.25)
})
])
编辑无效的内容
NSLayoutConstraint.activate([
[b4].flatMap { [
textBox.topAnchor.constraint(equalTo: view.topAnchor),
textBox.leadingAnchor.constraint(equalTo: view.leadingAnchor),
textBox.heightAnchor.constraint(equalTo: view.heightAnchor,multiplier: 0.08),
textBox.widthAnchor.constraint(equalTo: view.widthAnchor,multiplier: 1),
[=11=].topAnchor.constraint(equalTo: colorLbl.bottomAnchor),
[=11=].leadingAnchor.constraint(equalTo: undo.trailingAnchor),
[=11=].heightAnchor.constraint(equalTo: view.heightAnchor,multiplier: 0.10),
[=11=].widthAnchor.constraint(equalTo: view.widthAnchor,multiplier: 0.25)
] }
])
您可以使用 flatMap
。例如,如果要将相同的约束添加到 b4
、b5
、b6
:
NSLayoutConstraint.activate(
[b4, b5, b6].flatMap { [
[=10=].topAnchor.constraint(equalTo: colorLbl.bottomAnchor),
[=10=].leadingAnchor.constraint(equalTo: b3.trailingAnchor),
[=10=].heightAnchor.constraint(equalTo: view.heightAnchor,multiplier: 0.10),
[=10=].widthAnchor.constraint(equalTo: view.widthAnchor,multiplier: 0.25)
] }
)
// call "activate" again to do the other constraints
NSLayoutConstraint.activate([
textBox.topAnchor.constraint(equalTo: view.topAnchor),
textBox.leadingAnchor.constraint(equalTo: view.leadingAnchor),
textBox.heightAnchor.constraint(equalTo: view.heightAnchor,multiplier: 0.08),
textBox.widthAnchor.constraint(equalTo: view.widthAnchor,multiplier: 1),
])
如果您使用 +
,您也可以只调用 activate
,但我发现这更难阅读:
NSLayoutConstraint.activate(
[b4, b5, b6].flatMap { [
[=11=].topAnchor.constraint(equalTo: colorLbl.bottomAnchor),
[=11=].leadingAnchor.constraint(equalTo: b3.trailingAnchor),
[=11=].heightAnchor.constraint(equalTo: view.heightAnchor,multiplier: 0.10),
[=11=].widthAnchor.constraint(equalTo: view.widthAnchor,multiplier: 0.25)
] }
+ [ // here!
textBox.topAnchor.constraint(equalTo: view.topAnchor),
textBox.leadingAnchor.constraint(equalTo: view.leadingAnchor),
textBox.heightAnchor.constraint(equalTo: view.heightAnchor,multiplier: 0.08),
textBox.widthAnchor.constraint(equalTo: view.widthAnchor,multiplier: 1),
]
)
或者,使用常规 for
循环并多次调用 NSLayoutConstraint.activate
。 没有错:
for b in [b4, b5, b6] {
NSLayoutConstraint.activate([
b.topAnchor.constraint(equalTo: colorLbl.bottomAnchor),
b.leadingAnchor.constraint(equalTo: b3.trailingAnchor),
b.heightAnchor.constraint(equalTo: view.heightAnchor,multiplier: 0.10),
b.widthAnchor.constraint(equalTo: view.widthAnchor,multiplier: 0.25)
])
}
NSLayoutConstraint.activate([
textBox.topAnchor.constraint(equalTo: view.topAnchor),
textBox.leadingAnchor.constraint(equalTo: view.leadingAnchor),
textBox.heightAnchor.constraint(equalTo: view.heightAnchor,multiplier: 0.08),
textBox.widthAnchor.constraint(equalTo: view.widthAnchor,multiplier: 1),
])
但是如果您要向一堆视图添加相同的约束,它们将完全相互重叠。
您似乎希望将这些视图水平排成一行。我会为此使用 UIStackView
,而不是手动添加约束。
let stackView = UIStackView(arrangedStackViews: [b3, b4, b5, b6])
stackView.axis = .horizontal
然后您可以向堆栈视图添加约束,并尝试使用 distribution
和 alignment
属性进行试验以获得所需的结果。
我想让我的 swift 代码看看在创建约束时是否可以使用类似于 for Each 循环的方法。现在代码无法编译。在正常设置中 $0 是 b4。如果我可以做这样的事情,如果我必须对多个对象执行此操作,那将使我的编码效率更高。
NSLayoutConstraint.activate([
[b4].forEach({
[=10=].topAnchor.constraint(equalTo: colorLbl.bottomAnchor),
[=10=].leadingAnchor.constraint(equalTo: b3.trailingAnchor),
[=10=].heightAnchor.constraint(equalTo: view.heightAnchor,multiplier: 0.10),
[=10=].widthAnchor.constraint(equalTo: view.widthAnchor,multiplier: 0.25)
})
])
编辑无效的内容
NSLayoutConstraint.activate([
[b4].flatMap { [
textBox.topAnchor.constraint(equalTo: view.topAnchor),
textBox.leadingAnchor.constraint(equalTo: view.leadingAnchor),
textBox.heightAnchor.constraint(equalTo: view.heightAnchor,multiplier: 0.08),
textBox.widthAnchor.constraint(equalTo: view.widthAnchor,multiplier: 1),
[=11=].topAnchor.constraint(equalTo: colorLbl.bottomAnchor),
[=11=].leadingAnchor.constraint(equalTo: undo.trailingAnchor),
[=11=].heightAnchor.constraint(equalTo: view.heightAnchor,multiplier: 0.10),
[=11=].widthAnchor.constraint(equalTo: view.widthAnchor,multiplier: 0.25)
] }
])
您可以使用 flatMap
。例如,如果要将相同的约束添加到 b4
、b5
、b6
:
NSLayoutConstraint.activate(
[b4, b5, b6].flatMap { [
[=10=].topAnchor.constraint(equalTo: colorLbl.bottomAnchor),
[=10=].leadingAnchor.constraint(equalTo: b3.trailingAnchor),
[=10=].heightAnchor.constraint(equalTo: view.heightAnchor,multiplier: 0.10),
[=10=].widthAnchor.constraint(equalTo: view.widthAnchor,multiplier: 0.25)
] }
)
// call "activate" again to do the other constraints
NSLayoutConstraint.activate([
textBox.topAnchor.constraint(equalTo: view.topAnchor),
textBox.leadingAnchor.constraint(equalTo: view.leadingAnchor),
textBox.heightAnchor.constraint(equalTo: view.heightAnchor,multiplier: 0.08),
textBox.widthAnchor.constraint(equalTo: view.widthAnchor,multiplier: 1),
])
如果您使用 +
,您也可以只调用 activate
,但我发现这更难阅读:
NSLayoutConstraint.activate(
[b4, b5, b6].flatMap { [
[=11=].topAnchor.constraint(equalTo: colorLbl.bottomAnchor),
[=11=].leadingAnchor.constraint(equalTo: b3.trailingAnchor),
[=11=].heightAnchor.constraint(equalTo: view.heightAnchor,multiplier: 0.10),
[=11=].widthAnchor.constraint(equalTo: view.widthAnchor,multiplier: 0.25)
] }
+ [ // here!
textBox.topAnchor.constraint(equalTo: view.topAnchor),
textBox.leadingAnchor.constraint(equalTo: view.leadingAnchor),
textBox.heightAnchor.constraint(equalTo: view.heightAnchor,multiplier: 0.08),
textBox.widthAnchor.constraint(equalTo: view.widthAnchor,multiplier: 1),
]
)
或者,使用常规 for
循环并多次调用 NSLayoutConstraint.activate
。 没有错:
for b in [b4, b5, b6] {
NSLayoutConstraint.activate([
b.topAnchor.constraint(equalTo: colorLbl.bottomAnchor),
b.leadingAnchor.constraint(equalTo: b3.trailingAnchor),
b.heightAnchor.constraint(equalTo: view.heightAnchor,multiplier: 0.10),
b.widthAnchor.constraint(equalTo: view.widthAnchor,multiplier: 0.25)
])
}
NSLayoutConstraint.activate([
textBox.topAnchor.constraint(equalTo: view.topAnchor),
textBox.leadingAnchor.constraint(equalTo: view.leadingAnchor),
textBox.heightAnchor.constraint(equalTo: view.heightAnchor,multiplier: 0.08),
textBox.widthAnchor.constraint(equalTo: view.widthAnchor,multiplier: 1),
])
但是如果您要向一堆视图添加相同的约束,它们将完全相互重叠。
您似乎希望将这些视图水平排成一行。我会为此使用 UIStackView
,而不是手动添加约束。
let stackView = UIStackView(arrangedStackViews: [b3, b4, b5, b6])
stackView.axis = .horizontal
然后您可以向堆栈视图添加约束,并尝试使用 distribution
和 alignment
属性进行试验以获得所需的结果。