UIStackView 和自动布局锚之间的区别
Difference between UIStackView and Auto Layout Anchor
我刚开始学习 UIStackView
并试图了解自己将自动布局单独应用于每个 UI 元素与使用堆栈视图之间的区别。
假设您有 5 个 UILabels
,并且您希望 space 平均分配它们。我可以使用自动布局锚点之类的东西:
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 个标签在屏幕上垂直居中?或者在另一个视图中?如果它们在堆栈视图中,您只需限制堆栈视图的位置。
或者,假设在运行时您想添加更多标签(或其他视图),或者在 label2
和 label3
之间插入 label-2A
?使用循环约束,您会遇到问题。使用堆栈视图,stack.insertArrangedSubview(label2A, at: 2)
(索引从零开始)就完成了。
堆栈视图还有许多其他排列功能,可以让设计复杂的 UI 变得非常简单。
搜索 UIStackView
以获取一些示例 - 或者甚至只是浏览此处标记为 uistackview
的一些帖子...我想您很快就会看到这些优点。
这两个元素的使用是可选的。 StackView 可以更轻松地实现更改(添加/删除)的项目。正如您所写,StackView 是一种简化。使用 Constraints,您可以获得与 StackView 相同的效果,但您将不得不有点累。
因为所有 UI 控件 UIStackView
都有自己的目的和用例,您可能 可以 实现它所做的一切,但您会浪费很多时间 :)。
例如。 UIStackView
有 5 种分布变体,垂直和水平,可与所有自动布局功能一起使用以支持各种屏幕尺寸等。
另外,很可能它比您编写的自定义代码经过了更好的测试。
您必须编写的代码行越少越好:)
我刚开始学习 UIStackView
并试图了解自己将自动布局单独应用于每个 UI 元素与使用堆栈视图之间的区别。
假设您有 5 个 UILabels
,并且您希望 space 平均分配它们。我可以使用自动布局锚点之类的东西:
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 个标签在屏幕上垂直居中?或者在另一个视图中?如果它们在堆栈视图中,您只需限制堆栈视图的位置。
或者,假设在运行时您想添加更多标签(或其他视图),或者在 label2
和 label3
之间插入 label-2A
?使用循环约束,您会遇到问题。使用堆栈视图,stack.insertArrangedSubview(label2A, at: 2)
(索引从零开始)就完成了。
堆栈视图还有许多其他排列功能,可以让设计复杂的 UI 变得非常简单。
搜索 UIStackView
以获取一些示例 - 或者甚至只是浏览此处标记为 uistackview
的一些帖子...我想您很快就会看到这些优点。
这两个元素的使用是可选的。 StackView 可以更轻松地实现更改(添加/删除)的项目。正如您所写,StackView 是一种简化。使用 Constraints,您可以获得与 StackView 相同的效果,但您将不得不有点累。
因为所有 UI 控件 UIStackView
都有自己的目的和用例,您可能 可以 实现它所做的一切,但您会浪费很多时间 :)。
例如。 UIStackView
有 5 种分布变体,垂直和水平,可与所有自动布局功能一起使用以支持各种屏幕尺寸等。
另外,很可能它比您编写的自定义代码经过了更好的测试。 您必须编写的代码行越少越好:)