forEach 在 nslaoyutconstraints 中的使用
Posted
技术标签:
【中文标题】forEach 在 nslaoyutconstraints 中的使用【英文标题】:forEach use in nslaoyutconstraints 【发布时间】:2020-12-16 00:30:16 【问题描述】:我希望我的 swift 代码查看在创建约束时是否可以使用类似于 for Each 循环的方法。现在代码无法编译。在正常设置中,$0 是 b4。如果我可以做这样的事情,如果我必须为多个对象执行此操作,我的编码效率会大大提高。
NSLayoutConstraint.activate([
[b4].forEach(
$0.topAnchor.constraint(equalTo: colorLbl.bottomAnchor),
$0.leadingAnchor.constraint(equalTo: b3.trailingAnchor),
$0.heightAnchor.constraint(equalTo: view.heightAnchor,multiplier: 0.10),
$0.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),
$0.topAnchor.constraint(equalTo: colorLbl.bottomAnchor),
$0.leadingAnchor.constraint(equalTo: undo.trailingAnchor),
$0.heightAnchor.constraint(equalTo: view.heightAnchor,multiplier: 0.10),
$0.widthAnchor.constraint(equalTo: view.widthAnchor,multiplier: 0.25)
]
])
【问题讨论】:
【参考方案1】:您可以使用flatMap
。例如,如果你想给b4
、b5
、b6
添加相同的约束:
NSLayoutConstraint.activate(
[b4, b5, b6].flatMap [
$0.topAnchor.constraint(equalTo: colorLbl.bottomAnchor),
$0.leadingAnchor.constraint(equalTo: b3.trailingAnchor),
$0.heightAnchor.constraint(equalTo: view.heightAnchor,multiplier: 0.10),
$0.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 [
$0.topAnchor.constraint(equalTo: colorLbl.bottomAnchor),
$0.leadingAnchor.constraint(equalTo: b3.trailingAnchor),
$0.heightAnchor.constraint(equalTo: view.heightAnchor,multiplier: 0.10),
$0.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
属性来获得所需的结果。
【讨论】:
您的第一个示例似乎不起作用它导致此错误无法将类型“[NSLayoutConstraint]”的值转换为预期的元素类型“Array[]
。
我明白你在说什么,我的 nslaout 约束就像 NSLayoutConstraint.activate([。我需要它来处理其他约束。
什么意思?你可以编辑你的问题来说明吗? @joebuck
@joebuck 我知道你有activate([
。我想让你解释为什么你需要([
。 “其他约束”是什么意思?您不能通过再次调用activate
来添加其他约束吗?以上是关于forEach 在 nslaoyutconstraints 中的使用的主要内容,如果未能解决你的问题,请参考以下文章