你如何正确对齐水平UIStackView?

问题描述 投票:15回答:4

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

swift interface-builder uistackview
4个回答
17
投票

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

在我看来,出于布局原因而改变这一点可能是对文本方向API的误用,以及一些黑客攻击,但考虑到这一点:

您可以使用语义下拉菜单更改界面构建器中特定视图的方向,该下拉菜单包含“强制从左到右”和“从右到左”的选项,这将改变它们弹出的方向但是它们的显示顺序也是如此。所以你必须颠倒堆栈视图中元素的顺序

Semantic selector in IB

或者你可以使用视图的semanticContentAttribute在代码中完成

stackView.semanticContentAttribute = .forceRightToLeft

3
投票

我有一个水平方向的UIStackView包含两个UIViews;隐藏其中一个视图导致另一个传播全宽。向剩余视图添加宽度约束会导致保持所需宽度,但会向右移动。

TL; DR

将一个隐藏的UIView添加到堆栈视图中,该视图显示另一个隐藏的间距。


3
投票

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


1
投票

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

然而,技巧是将前导堆栈视图约束关系从等于大于或等于更改。

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

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

所以:

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

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

stackView.distribution = .equalSpacing
© www.soinside.com 2019 - 2024. All rights reserved.