【问题标题】:In AutoLayout can you combine both horizontal and vertical constraints using the Visual Format Language?在 AutoLayout 中,您可以使用 Visual Format Language 结合水平和垂直约束吗?
【发布时间】:2023-03-06 04:26:01
【问题描述】:

在我们很多地方的代码中,我不断看到这个......

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]))

那么这样的事情可能吗?

【问题讨论】:

  • 强烈建议学习/使用约束没有视觉格式语言。它会更清晰,并且有许多您无法使用 VFL 设置的约束。
  • 对于简单的集合,VFL 很好,但对于大多数人来说,同意。同样,不是我的代码。不过,我们正在尝试消除冗余,我经常看到这种情况。

标签: ios autolayout visual-format-language


【解决方案1】:

抱歉你不能用这个,但你可以试试这样的

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]))}

【讨论】:

  • 好主意!对于菜鸟来说不是最清楚的,但话又说回来,我们尽量不让我们的团队中有菜鸟! :) 实际上,我想我会在 UIView 上创建一个扩展,它接受一个可变参数字符串数组,这样我们就可以轻松地做这样的事情。再次,非常酷的想法!
  • 如果你打算这样做,你应该使用forEach而不是mapmap 的目的是将一个数组或序列转换为数组。你不想在这里创建一个数组,是吗?
  • 在这种特殊情况下,map 等同于 forEach,因为没有发生映射,如果您尝试打印结果,它将是 () ,实际上它是一个 for 循环的化约
  • 您正在创建一个数组 [(), ()] 并将其丢弃。这是对map的滥用。
  • 好点! ForEach 会比这里的 Map 更好。 @Sh_Khan,您能否更新您的代码以使用 ForEach,并且正如其他人所建议的那样,激活约束而不是添加它们?如果您这样做,我会将其标记为已接受。
【解决方案2】:

评论:

  1. 您应该激活约束而不是将它们添加到视图中(从 iOS 8 开始)。
  2. 您可以跳过整个options: NSLayoutFormatOptions(rawValue: 0),因为这是默认值。
  3. 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]))

【讨论】:

    【解决方案3】:

    不,遗憾的是语法不允许这样做 - 请参阅 the docs 中的语法

    具体来说,<orientation> H|V 这行表示orientation 的值 可以是HV,但不能同时是两者。

    程序化自动布局的一个很好的替代方法是使用开源 DSL 库 - 其中两个流行的例子是 CartographySnapkit

    我都使用过,发现它们比 VFL 简单得多,也比底层 Apple API 简洁得多

    【讨论】:

    • 是的,我喜欢这些类型的东西。不幸的是,为一家大型银行工作,我们必须通过大量的文书工作才能使用任何公共或开源的东西。很多繁文缛节。
    • 啊,我明白了,这很烦人!
    • 是的!当然是。我们最终推出了社区已经完成的大量工作,以便银行可以“拥有”一切。
    猜你喜欢
    • 1970-01-01
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-19
    • 1970-01-01
    • 2014-03-06
    相关资源
    最近更新 更多