ios 在AutoLayout中,您可以使用可视格式语言合并水平和垂直约束吗?

gt0wga4j  于 2023-08-08  发布在  iOS
关注(0)|答案(4)|浏览(77)

在我们的代码中很多地方,我一直看到这个…

containerView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-0-[view]-0-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["view":childView]))
containerView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-0-[view]-0-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["view":childView]))

字符串
对我来说是多余的。我想知道是否有一种方法可以将这些格式组合成一个字符串;像这样的事

containerView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-0-[view]-0-|;V:|-0-[view]-0-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["view":childView]))


那么这样的事情可能吗?

wnrlj8wa

wnrlj8wa1#

对不起,你不能用这个,但你可以试试这样的东西

let rr = UIView()

rr.backgroundColor = UIColor.red

self.view.addSubview(rr)

rr.translatesAutoresizingMaskIntoConstraints = false

["H:|-100-[rr]-100-|","V:|-100-[rr]-100-|"].forEach{NSLayoutConstraint.activate(NSLayoutConstraint.constraints(withVisualFormat: $0, options: NSLayoutFormatOptions.init(rawValue: 0), metrics: nil, views: ["rr":rr]))}

字符串

vs3odd8k

vs3odd8k2#

备注:
1.您应该激活约束,而不是将它们添加到视图中(自iOS 8起)。
1.您可以跳过整个options: NSLayoutFormatOptions(rawValue: 0),因为这是默认值。

  1. VFL返回一个约束数组,因此您可以将数组添加到一起。
    通过这些更改,我们得到这行代码:
NSLayoutConstraint.activate(NSLayoutConstraint.constraints(withVisualFormat: "H:|-0-[view]-0-|", metrics: nil, views: ["view":childView]) + NSLayoutConstraint.constraints(withVisualFormat: "V:|-0-[view]-0-|", metrics: nil, views: ["view":childView]))

字符串

lskq00tm

lskq00tm3#

以下是Shehata的回答,使用不同的代码格式:

NSLayoutConstraint.activate(
    [
        "H:|-0-[view]-0-|",
        "V:|-0-[view]-0-|"
    ].flatMap {
        NSLayoutConstraint.constraints(
            withVisualFormat: $0,
            metrics: nil,
            views: ["view": gutterView]
        )
    }
)

字符串

pu3pd22g

pu3pd22g4#

不,不幸的是,语法不允许这样做-参见the docs中的语法
具体地,线<orientation> H|V意味着orientation的值可以是HV,但不能是两者。
编程自动布局的一个好选择是使用开源DSL库-两个流行的示例是CartographySnapkit
我用过这两种方法,发现它们比VFL少得多,也比底层的API少得多

相关问题