我有一个 View (后来称为自定义 View ),它在其中呈现 subview 。将它们渲染出来后,我得到一个新的所需高度值(因此所有 subview 都可见)并尝试更新 View 的高度。这是从 UITableViewCell
的子类的 awakeFromNib()
方法调用的代码(注意:ReactiveSwift
在下面的代码中使用):
customView.model.requiredHeight.producer
.observe(on: UIScheduler())
.skipNil()
.skipRepeats()
.startWithValues { [weak self] in
print("increased Height: ", $0)
self?.customViewHeightConstraint.constant += $0
print("customView height: ", self?.customView.frame)
}
因此,要添加到约束中的正确高度已被抓取,第一个打印语句确认了这一点。但是,这不会改变 View 的外观。最后的打印语句显示,即使我将值添加到 View 的高度约束,它的框架也是一样的。
我需要指出的是,这个所谓的自定义 View 位于 UITableView
的行内。这是布局(绿色矩形是单元格,黄色是 UILabel
,红色是 View ):
因此,所有内容都固定在边缘。我为该行使用自动行高(但是,如果我将其设置为自定义则没有区别)并在 TableView 委托(delegate)的 tableView(_:estimatedHeightForRowAt:)
方法中返回 UITableView.automaticDimension
作为估计高度。
老实说,我确定我遗漏了一些明显但无法弄清楚的东西。如果自定义 View 不在单元格内,则此技术非常有效,所以我认为,这与表格 View 单元格有关。
最佳答案
你做的一切都是对的,你的约束也是正确的,但是 TableView 还没有听说它们已经改变的事实。您需要重新加载 TableView (或至少这一行)。
顺便说一句,最好的方法是执行一个空的批量更新,因为这会导致约束的变化动画化,这是一个非常漂亮的外观。
编辑: 我说“您的约束是正确的”,但您后来添加的评论表明这不是真的。听起来您正在尝试将固定布局与自动布局“混合搭配”:您的自定义 View 使用自动布局,但其 subview 不使用。不要那样做。
与其手动更改自定义 View 的高度约束,不如在内部对所有 subview 使用约束,以便它们的约束从内到外调整自定义 View 的大小——与单元格本身的工作方式完全相同。或者,您应该关闭单元格的自动调整大小并实现 heightForRowAt
以手动指定整个单元格的高度。
关于ios - 以编程方式增加 TableView 行中自定义 View 的高度(结果也是该行的高度),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58354747/