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。例如,如果要将相同的约束添加到 b4b5b6:

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

然后您可以向堆栈视图添加约束,并尝试使用 distributionalignment 属性进行试验以获得所需的结果。