【问题标题】:Reordering subviews programatically won't work in a tableViewCell以编程方式重新排序子视图在 tableViewCell 中不起作用
【发布时间】:2025-12-09 09:10:02
【问题描述】:

我正在尝试重新排序图像和堆栈视图(此处称为标签堆栈),它们都包含在另一个堆栈视图(此处称为堆栈)中。我的目标是以编程方式反转两个子视图的索引顺序,以便在运行时更改它们的位置(它们是水平分布的,所以理论上,如果我重新排序它们的索引,它应该在自动布局中重新排序它们)

我尝试从 Apple 文档更新索引、交换子视图、sendViewForward 等,但它不起作用,这是我的 tableViewCell 的代码:

     override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code


           }

    override func layoutSubviews() {
        cellImage.layer.cornerRadius = cellImage.bounds.height / 3
        cellImage.clipsToBounds = true

        if incoming {
        } else {
// as one of the many methods that didn't work
            self.stack.insertSubview(cellImage, belowSubview: labelsStack)
        }


    }

【问题讨论】:

  • 您是否考虑过设置 2 组自动布局约束,然后打开和关闭它们,而不是使用堆栈?
  • 布局约束集 ???您的意思是以编程方式不在情节提要中?
  • 我的意思是在情节提要中,两个集合都从情节提要中停用一个集合,只保留另一个活动。然后为所有这些创建插座,并在代码中使用插座激活/停用您需要的东西。
  • 我不知道我们可以设置约束集,并在情节提要中停用它们,你有任何链接可以谈论这个,我没有看到在网上找到任何东西
  • 嗯,我会写下来,并在答案中附上几张截图;-)

标签: ios swift autolayout layoutsubviews uitableview


【解决方案1】:

您可以创建两组替代约束,一组用于默认顺序,另一组用于相反顺序。默认约束是以 1 结尾的约束

要最初停用替代设置,您可以使用检查器并更改 已安装 复选框

您的视图控制器现在应该有 6 个出口:

@IBOutlet weak var topViewTopConstraint1: NSLayoutConstraint!
@IBOutlet weak var bottomViewTopConstraint1: NSLayoutConstraint!
@IBOutlet weak var bottomViewBottomConstraint1: NSLayoutConstraint!

@IBOutlet weak var topViewTopConstraint2: NSLayoutConstraint!
@IBOutlet weak var bottomViewTopConstraint2: NSLayoutConstraint!
@IBOutlet weak var topViewBottomConstraint2: NSLayoutConstraint!

现在激活您可以使用的另一组约束:

    self.topViewBottomConstraint2.active = true
    self.topViewTopConstraint2.active = true
    self.bottomViewTopConstraint2.active = true
    self.topViewTopConstraint1.active = false
    self.bottomViewBottomConstraint1.active = false
    self.bottomViewTopConstraint1.active = false

反之亦然

【讨论】:

  • 效果很好,虽然很棘手,但它可以满足我的需要,谢谢 :)