翻转 UIStackView 中项目的位置

Posted

技术标签:

【中文标题】翻转 UIStackView 中项目的位置【英文标题】:Flipping the positions of items in a UIStackView 【发布时间】:2018-01-22 07:26:21 【问题描述】:

我有一个UIStackView,在Interface Builder 中创建,包含两个视图。现在我正在尝试以编程方式更改这些视图的顺序(可以说交换它们的位置)。

使用 Interface Builder 来完成此操作是否有一个简单的解决方法?

谢谢:)。

【问题讨论】:

如何将语义更改为 .forceRightToLeft。这是一个简单快捷但不是很好的解决方法。 【参考方案1】:

UIStackView 中创建一个带有 2 个UIViews 的布局,如下所示:

为您的UIStackView 创建一个出口到您的UIViewController。在viewDidLoad 中的UIStackView 上致电addArrangedSubview 以更改订单。请参阅下面的 sn-p。

import UIKit

class ViewController: UIViewController 
    @IBOutlet weak var stackView: UIStackView!

    override func viewDidLoad() 
        super.viewDidLoad()

        // Switches order of the stackView
        stackView.addArrangedSubview(self.stackView.subviews[0])
    

这应该是结果:

addArrangedSubview 获取给定的视图并将其添加到排列的子视图数组的末尾。在我们的例子中,我们在 index[0] 处获取红色视图并将其添加到 UIStackView 的末尾(右侧)。

【讨论】:

如果我在 stackview 中有 4-5 个视图怎么办?【参考方案2】:

您可以将 UIStackView 的视图 semanticUnspecified 更改为 Force Right-to-Left 以交换嵌套视图的位置。

【讨论】:

teamOne.semanticContentAttribute = .forceRightToLeft 似乎对我没有任何作用,结果是一样的 hStack.semanticContentAttribute = checkBoxOnRight ? .forceLeftToRight : .forceRightToLeft 曾在 Xcode 12、Swift 5.2 中工作 同意@ilikecode 这对我xCode 13 完全没有任何作用。【参考方案3】:

您可以使用addArragnedSubview 重新排列视图。 只需要 addArragnedSubview,因为在将视图添加到新父级时,它会从旧父级中删除。

    if self.viewsSwitched
        stackview.addArrangedSubview(self.stackview.subviews[0])
        self.viewsSwitched = false
    else
        stackview.addArrangedSubview(self.stackview.subviews[1])
        self.viewsSwitched = true

    

这段代码通过每次调用交换stackview中的两个视图

【讨论】:

以上是关于翻转 UIStackView 中项目的位置的主要内容,如果未能解决你的问题,请参考以下文章

在 UIStackView 中设置锚点和位置

UIStackView 的高度和垂直位置不明确

Xcode IB 警告 UICollectionViewCell 中 UIStackView 的位置不明确,尽管它不应该是

空的 UIStackView 导致不明确的高度/位置

UIStackView 在 UIScrollView 位置

检测 UIStackView 间距中的点击(项目之间)