以编程方式增加 table 视图行中自定义视图的高度(结果也是该行的高度)
Increasing a custom view's height in a table view row (and as a result the row's one, too) programmatically
我有一个视图(后来称为自定义视图),它在其中呈现子视图。将它们渲染出来后,我得到一个新的所需高度值(因此所有子视图都可见)并尝试更新视图的高度。这是从 UITableViewCell
的子类的 awakeFromNib()
方法调用的代码(注意:下面的代码中使用了 ReactiveSwift
):
customView.model.requiredHeight.producer
.observe(on: UIScheduler())
.skipNil()
.skipRepeats()
.startWithValues { [weak self] in
print("increased Height: ", [=11=])
self?.customViewHeightConstraint.constant += [=11=]
print("customView height: ", self?.customView.frame)
}
因此,抓取了要添加到约束中的正确高度,并且第一个打印语句确认了这一点。但是,这不会改变视图的外观。最后的打印语句显示,即使我将值添加到视图的高度约束,它的框架也是一样的。
我需要指出的是,这个所谓的自定义视图位于 UITableView
的行内。这是布局(绿色矩形是单元格,黄色是 UILabel
,红色是视图):
因此,所有内容都固定在边缘。我为该行使用自动行高(但是,如果我将其设置为自定义则没有区别)并在 table 视图委托的 tableView(_:estimatedHeightForRowAt:)
方法中使用 return UITableView.automaticDimension
作为估计高度。
老实说,我确定我遗漏了一些明显但无法弄清楚的东西。如果自定义视图不在单元格内,则此技术非常有效,所以我认为,这与 table 视图单元格有关。
你做的一切都是对的,你的约束也是正确的,但是table视图并没有听说它们已经改变了。您需要重新加载 table 视图(或至少这一行)。
顺便说一句,最好的方法是执行空的批量更新,因为这会导致约束的变化动画,这是一个非常好看
编辑: 我说 "your constraints are correct",但您后来添加的评论表明这不是真的。听起来您正在尝试 "mix and match" 使用自动布局固定布局:您的自定义视图使用自动布局,但其子视图不使用。不要那样做。
与其手动更改自定义视图的高度约束,不如在内部对所有子视图使用约束,以便它们的约束从内到外调整自定义视图的大小——与单元格本身的工作方式完全相同.要么,要么您应该关闭单元格的自动调整大小并实施 heightForRowAt
以手动指定整个单元格高度 .
我有一个视图(后来称为自定义视图),它在其中呈现子视图。将它们渲染出来后,我得到一个新的所需高度值(因此所有子视图都可见)并尝试更新视图的高度。这是从 UITableViewCell
的子类的 awakeFromNib()
方法调用的代码(注意:下面的代码中使用了 ReactiveSwift
):
customView.model.requiredHeight.producer
.observe(on: UIScheduler())
.skipNil()
.skipRepeats()
.startWithValues { [weak self] in
print("increased Height: ", [=11=])
self?.customViewHeightConstraint.constant += [=11=]
print("customView height: ", self?.customView.frame)
}
因此,抓取了要添加到约束中的正确高度,并且第一个打印语句确认了这一点。但是,这不会改变视图的外观。最后的打印语句显示,即使我将值添加到视图的高度约束,它的框架也是一样的。
我需要指出的是,这个所谓的自定义视图位于 UITableView
的行内。这是布局(绿色矩形是单元格,黄色是 UILabel
,红色是视图):
因此,所有内容都固定在边缘。我为该行使用自动行高(但是,如果我将其设置为自定义则没有区别)并在 table 视图委托的 tableView(_:estimatedHeightForRowAt:)
方法中使用 return UITableView.automaticDimension
作为估计高度。
老实说,我确定我遗漏了一些明显但无法弄清楚的东西。如果自定义视图不在单元格内,则此技术非常有效,所以我认为,这与 table 视图单元格有关。
你做的一切都是对的,你的约束也是正确的,但是table视图并没有听说它们已经改变了。您需要重新加载 table 视图(或至少这一行)。
顺便说一句,最好的方法是执行空的批量更新,因为这会导致约束的变化动画,这是一个非常好看
编辑: 我说 "your constraints are correct",但您后来添加的评论表明这不是真的。听起来您正在尝试 "mix and match" 使用自动布局固定布局:您的自定义视图使用自动布局,但其子视图不使用。不要那样做。
与其手动更改自定义视图的高度约束,不如在内部对所有子视图使用约束,以便它们的约束从内到外调整自定义视图的大小——与单元格本身的工作方式完全相同.要么,要么您应该关闭单元格的自动调整大小并实施 heightForRowAt
以手动指定整个单元格高度 .