如何右对齐水平 UIStackView?

How do you right align a horizontal UIStackView?

我还没有在任何地方找到这个问题的答案,我不确定是否可行,但我正在尝试右对齐水平 UIStackView,这样如果子视图被隐藏,它们就会移动朝向右侧而不是左侧。以编程方式(在 Swift 中)或使用 Interface Builder

UIStackViews 根据用户的文本方向对齐,即英语和其他罗马文字左对齐,或希伯来语等语言右对齐。

在我看来,出于布局原因更改此设置可能是对文本方向 API 的误用,并且有点骇人听闻,但请记住:

您可以在界面生成器中更改特定视图的方向,使用语义下拉菜单,它有 'Force Left-to-Right' 和 'Force Right-to-Left' 选项,这将改变它们弹出的方向,但也它们显示的顺序。所以你必须颠倒堆栈视图中元素的顺序

或者您可以在代码中使用视图的 semanticContentAttribute

stackView.semanticContentAttribute = .forceRightToLeft

我有一个水平方向的 UIStackView,其中包含两个 UIView;隐藏其中一种观点导致另一种观点传播 full-width。向剩余视图添加宽度约束导致保持所需的宽度,但它向右移动。

TL;DR

添加一个隐藏的 UIView 到堆栈视图,当另一个因间距而隐藏时显示。

对我来说最有效的方法是将水平堆栈视图放在垂直堆栈视图中,并将垂直堆栈视图设置为前导

与其他答案不同,该解决方案实际上相当简单。您需要的是添加一个尾部约束,将堆栈视图固定到其父视图的后缘,然后还添加一个前导约束,将其固定到父视图的前缘。

然而,诀窍是将领先的堆栈视图约束关系从 等于 更改为 大于或等于

这将允许堆栈视图的前缘捕捉到堆栈视图内容的固有宽度,有效地将所有内容固定到后缘。

垂直堆栈视图类似。用等于固定顶部,用小于或等于固定底部。

所以:

stackView.leadingAnchor.constraint(greaterThanOrEqualTo: parent.leadingAnchor).isActive = true

stackView.trailingAnchor.constraint(equalTo: parent.trailingAnchor).isActive = true

stackView.distribution = .equalSpacing