ios - UIStackView 和 Auto Layout Anchor 的区别
问题描述
我新近学习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
沿主轴。
这些是粗略的例子,但我是否正确理解你几乎可以使用自动布局锚或视觉格式语言完成堆栈视图所做的一切,但堆栈视图使它更容易?
或者使用自动布局锚或视觉格式语言无法完成的堆栈视图是否有独特的好处?
解决方案
视觉格式语言有很多限制。我的印象(可能是错误的)是 Apple 甚至不再开发它 - 它只是为了向后兼容。
对于您的简单布局示例,您是对的。您可以对循环执行与堆栈视图相同的操作。
但是...假设您希望这 5 个标签在屏幕上垂直居中?还是在另一个视图中?如果它们在堆栈视图中,您只需限制堆栈视图的位置。
或者,假设在运行时您想要添加更多标签(或其他视图),或者在andlabel-2A
之间插入?使用循环约束,您会遇到问题。使用堆栈视图(索引从零开始),您就完成了。label2
label3
stack.insertArrangedSubview(label2A, at: 2)
堆栈视图还具有许多其他排列功能,可以在设计复杂的 UI 时使生活变得非常简单。
搜索UIStackView
一些示例 - 或者甚至只是浏览这里标记为uistackview
...的一些帖子我想你会很快看到优势。
推荐阅读
- c++ - do{}while(0) 与空语句
- sql - 在存储过程中使用 xp_cmdshell 运行某些 curl 命令时速度很慢,这是为什么呢?
- sql - 避免在 MERGE 和 UPDATE 语句中多次调用标量函数
- r - extract info from a column based on value from another column in data.frame r
- javascript - 正则表达式 - 验证十进制数 - 最多 50 位不包括小数 | 小数可选 | 任何没有。小数点前或后允许的位数
- angular - 将json对象数据显示为下拉列表角度2?
- python - Pandas Dataframe:访问单元格中列表中的子元素的元素
- ios - 如何使用 Aspect Fit 删除在滚动视图中拍摄的 ImageView 中的额外空间?
- javascript - Javascript奇怪的比较结果
- python - 直接从 html 模板中删除用户