ios - 当某些 UIStackView 的 subview 未隐藏时,UITableViewCell 不会更改高度

标签 ios iphone swift uitableview uistackview

正如标题所说,我有一个自定义的 UITableCell,其中有一些 UIStackView。这些堆栈中的每一个都包含许多 subview ,但我只想在第一次显示单元格时显示其中的三个。如果用户想要查看更多内容,可以使用 [+] 按钮调用添加剩余内容的方法。

自定义单元格高度是通过 UITableViewAutomaticDimension 确定的,它非常适合单元格的首次显示,但是当我尝试向堆栈添加和删除 subview 时,有些 View 不应该被修改,因为它们失去了约束和在某些情况下,应该显示的内容不会显示。我想要的是显示所有 UILabel 和要更新的单元格的高度。

按下按钮 [+] 时调用的方法如下:

@objc private func changeImage(sender: UIButton) {

    let index = (Int(sender.accessibilityValue!)!)
    let open : Bool = openItem[index]
    let plateStack : UIStackView = plateStacks[index]
    let plates : [UILabel] = platesViews[index]

    if !open {
       sender.setImage(UIImage(named: "less")?.withRenderingMode(.alwaysTemplate), for: .normal)
       let nPlatesToAdd = max(platesViews[index].count - 3, 0)
       for i in 0..<nPlatesToAdd {
            let plate = plates[i + 3]
            plateStack.addArrangedSubview(plate)
            plate.leadingAnchor.constraint(equalTo: plateStack.leadingAnchor, constant: 0).isActive = true
            plate.trailingAnchor.constraint(equalTo: plateStack.trailingAnchor, constant: 0).isActive = true
        }
    }
    else {
        sender.setImage(UIImage(named: "more")?.withRenderingMode(.alwaysTemplate), for: .normal)
        var i = plateStack.arrangedSubviews.count - 1
        while i > 2 {
            let view = plateStack.arrangedSubviews[i]
            plateStack.removeArrangedSubview(view)
            view.removeFromSuperview()
            i = i - 1
        }
    }
        openItem[index] = !open
}

单元格的第一次显示(一切正常)和点击 [+] 按钮后:

enter image description here

最佳答案

发生这种情况是因为 tableView 已经渲染了它的布局。 您可能需要检查一些原因:

  • 确保 stackView 约束正确地放入 contentView
  • stackView 的分布必须是fill
  • 更改影响 tableView 高度的内容后,您可以使用这些代码更新单元格高度而无需重新加载表格:

    tableView.beginUpdates()
    tableView.endUpdates()

关于ios - 当某些 UIStackView 的 subview 未隐藏时,UITableViewCell 不会更改高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52441045/

相关文章:

objective-c - 如何隐藏 iOS 模拟器?

iphone - 自定义 UITableViewCell 删除 subview

swift - 如何使用键值编码访问父类(super class)属性?

json - Alamofire 4.0 JSOn 解析 Swift

ios - NSPredicate 中的不一致

ios - 完成处理程序在 viewDidLoad 中不起作用?

objective-c - 如何使用 iOS 钥匙串(keychain)存储多个用户名和密码?

ios - 如何使用相对于容器调整大小的项目初始化 UICollectionViewController?

iphone - 如何在 xCode 4.2 中添加 Entitlement.plist

ios - swift 错误 "UIButton.currentTitle must be used from main thread only"