我刚开始学习UIStackView,并试图理解将自动布局单独应用于每个UI元素与使用堆栈视图之间的区别。
假设您有5个UILabels,并且希望将它们平分。我可以使用类似于“自动布局锚”这样的东西:
var previous: UILabel?
for label in [label1, label2, label3, label4, label5] {
label.heightAnchor.constraint(equalToConstant: 88).isActive = true
if let previous = previous {
label.topAnchor.constraint(equalTo: previous.bottomAnchor, constant: 10).isActive = true
} else {
label.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 0).isActive = true
}
previous = label
}或视觉格式语言:
let viewsDictionary = ["label1": label1, "label2": label2, "label3": label3, "label4": label4, "label5": label5]
view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[label1(labelHeight@999)]-[label2(label1)]-[label3(label1)]-[label4(label1)]-[label5(label1)]-(>=10)-|", options:[], metrics: metrics, views: viewsDictionary))或者使用堆栈视图并沿主轴在equalSpacing设置分发设置。
这些都是粗略的例子,但我是否正确地理解了,您几乎可以使用自动布局锚或Visual语言完成堆栈视图所做的所有事情,但是堆栈视图可以使它更简单吗?
还是使用“自动布局锚”或“视觉格式语言”无法完成的堆栈视图有独享的好处?
发布于 2020-07-09 14:37:42
可视化格式语言具有很多的局限性。我的印象(可能是错的)是,苹果甚至不再开发它--它只是为了向后兼容。
对于简单的布局示例,您是正确的。您可以对循环执行与堆栈视图相同的操作。
然而..。假设您希望这5个标签垂直地在屏幕上居中?还是在另一个视野里?如果它们位于堆栈视图中,则简单地约束堆栈视图的位置。
或者,假设在运行时要添加更多的标签(或其他视图),或者在label2和label3之间插入label2?有了你的环约束,你就有问题了。使用堆栈视图,stack.insertArrangedSubview(label2A, at: 2) (索引是基于零的)就完成了。
在设计复杂的UI时,堆栈视图还具有许多其他安排功能,使生活变得非常简单。
以搜索UIStackView为例--甚至浏览一些带有uistackview标记的帖子.我想你很快就会明白其中的优势。
发布于 2020-07-09 14:44:20
这两个元素的使用是可选的。StackView使实现更改项变得更容易(添加/删除)。正如您所写的,StackView是一种简化。有了约束,您可以获得与StackView相同的效果,但您将不得不感到有点累。
发布于 2020-07-09 14:46:55
由于所有UI控件都有自己的用途和用例,所以UIStackView可能可以实现它所做的一切,但是您将浪费大量时间:)。例如,UIStackView有5种发行版本,垂直和水平,可与所有自动布局功能一起使用,以支持各种屏幕大小等。
而且,它很可能比您编写的自定义代码更好地进行测试。代码行越少,越好:)
https://stackoverflow.com/questions/62816785
复制相似问题