如何为堆栈视图中的右对齐定义 NSLayoutConstraint?
How do I define NSLayoutConstraint for a right alignment within a stack view?
我尝试在两个堆栈视图中对齐一个图标、一些文本和一个结果。
第一个堆栈视图是垂直的,包含 X 个水平堆栈视图。每个水平堆栈视图都包含一个 UIImageView
和两个 UILabel
。
虽然 UIImageView
和第一个 UILabel
应该左对齐,但最后一个 UILabel
应该在堆栈视图的右侧对齐。
整个 UI 是用代码生成的,在本例中是 C#,但我认为将 Swift 代码转换为 C# 并不难。在阅读了一些关于 iOS UI 的内容后,我想我可以用 NSLayoutConstraint
解决这个问题,但我不知道如何使用它——我目前的尝试总是以异常结束。
这就是我目前设置约束的方式:
dataStack.Constraints.Append(NSLayoutConstraint.Create(percentageLabel, NSLayoutAttribute.Trailing, NSLayoutRelation.Equal, dataStack, NSLayoutAttribute.Leading, 1, 0));
编辑:
这是它目前的样子:https://puu.sh/Ddlrx/ab36d7c864.png 但百分比应该右对齐,这样每一行都在同一个地方结束。
这是我当前生成 UI 的代码:https://pastebin.com/pvMTGx0U
当前代码中的约束是 XCode Designer 中工作实现的 1:1 副本...我不明白为什么它不能在我的小部件中以这种方式工作. :/
添加垂直 Stackview
stackView.alignment = .fill
stackView.distribution = .fillEqually
stackView.spacing = 2
添加顶部、前导、尾随、底部约束。不要添加高度限制。它将根据子视图计算。
接下来添加 n 个水平堆栈视图作为排列的子视图
stackView.alignment = .center
stackView.distribution = .fillProportionally
stavkView.spacing = 2
现在在每个水平堆栈视图中添加一个图像视图和两个标签。
不要向这些图像视图和标签添加前导、尾随、顶部、底部约束。
为每个图像视图添加宽度和高度限制
为 lbl1 和 lbl2 分配相同的宽度
lbl1.widthAnchor.constraint(equalTo: lbl2.widthAnchor).isActive = true
将lbl2
的textAlignemnt
更改为.right
lbl2.textAlignment = .right
现在你会得到这个
或
而不是将等于添加到 lbl1 和 lbl2
为 lbl2 设置内容拥抱优先级
lbl2.setContentHuggingPriority(.defaultHigh, for: .horizontal)
现在 lbl2 的宽度将缩小以适合其文本。 lbl1 将占用剩余宽度
我尝试在两个堆栈视图中对齐一个图标、一些文本和一个结果。
第一个堆栈视图是垂直的,包含 X 个水平堆栈视图。每个水平堆栈视图都包含一个 UIImageView
和两个 UILabel
。
虽然 UIImageView
和第一个 UILabel
应该左对齐,但最后一个 UILabel
应该在堆栈视图的右侧对齐。
整个 UI 是用代码生成的,在本例中是 C#,但我认为将 Swift 代码转换为 C# 并不难。在阅读了一些关于 iOS UI 的内容后,我想我可以用 NSLayoutConstraint
解决这个问题,但我不知道如何使用它——我目前的尝试总是以异常结束。
这就是我目前设置约束的方式:
dataStack.Constraints.Append(NSLayoutConstraint.Create(percentageLabel, NSLayoutAttribute.Trailing, NSLayoutRelation.Equal, dataStack, NSLayoutAttribute.Leading, 1, 0));
编辑: 这是它目前的样子:https://puu.sh/Ddlrx/ab36d7c864.png 但百分比应该右对齐,这样每一行都在同一个地方结束。
这是我当前生成 UI 的代码:https://pastebin.com/pvMTGx0U
当前代码中的约束是 XCode Designer 中工作实现的 1:1 副本...我不明白为什么它不能在我的小部件中以这种方式工作. :/
添加垂直 Stackview
stackView.alignment = .fill
stackView.distribution = .fillEqually
stackView.spacing = 2
添加顶部、前导、尾随、底部约束。不要添加高度限制。它将根据子视图计算。
接下来添加 n 个水平堆栈视图作为排列的子视图
stackView.alignment = .center
stackView.distribution = .fillProportionally
stavkView.spacing = 2
现在在每个水平堆栈视图中添加一个图像视图和两个标签。
不要向这些图像视图和标签添加前导、尾随、顶部、底部约束。
为每个图像视图添加宽度和高度限制
为 lbl1 和 lbl2 分配相同的宽度
lbl1.widthAnchor.constraint(equalTo: lbl2.widthAnchor).isActive = true
将lbl2
的textAlignemnt
更改为.right
lbl2.textAlignment = .right
现在你会得到这个
或
而不是将等于添加到 lbl1 和 lbl2
为 lbl2 设置内容拥抱优先级
lbl2.setContentHuggingPriority(.defaultHigh, for: .horizontal)
现在 lbl2 的宽度将缩小以适合其文本。 lbl1 将占用剩余宽度