如何使用 UIKit 在 Swift 5 中创建具有固有高度的 UITableView?
How to create an UITableView with an intrinsic Height in Swift 5 using UIKit?
我 运行 在使用 UITableViews
时遇到问题。
AutoLayout requires a fixed Height Constraint for the UITableView, so the Height does not change when I add or remove TableViewCells
.
我的问题是,我使用的是 TableView
inside ScrollView
。这不是很好,因为 两个元素都是可滚动的。
My Plan is to always resize the TableView in relation to its content Height. In this case the TableView can never get scrolled.
到目前为止,我的想法如下,但由于某些原因,它并没有真正起作用:
tableView.frame = CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: tableView.contentSize.height)
如果您对如何解决此问题有任何想法,请在下方发表评论。 首选没有 class 扩展等的简单解决方案;)
非常感谢你们!
您可以按照以下方式使用:
final class AutoSizingTableView: UITableView {
override init(frame: CGRect, style: UITableView.Style) {
super.init(frame: frame, style: style)
setContentCompressionResistancePriority(.required, for: .vertical)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setContentCompressionResistancePriority(.required, for: .vertical)
}
override var contentSize: CGSize {
didSet {
invalidateIntrinsicContentSize()
}
}
override func reloadData() {
super.reloadData()
invalidateIntrinsicContentSize()
}
override var intrinsicContentSize: CGSize {
setNeedsLayout()
layoutIfNeeded()
return contentSize
}
}
基本上,当重新加载 tableview 的数据或 contentSize 发生变化时,将 intrinsicContentSize 设置为等于 contentSize。
但是你必须问自己这个问题:如果我不需要出队逻辑,我真的需要一个表视图吗?
您需要重写 UIViewController 中的 updateViewConstraints()
方法并设置 tableView
的新高度,如下所示:
override func updateViewConstraints() {
tableViewHeightConstraint?.constant = tableView.contentSize.height
super.updateViewConstraints()
}
并在您需要使用新高度重新创建 tableView
时调用 self.view.setNeedsUpdateConstraints()
。
我 运行 在使用 UITableViews
时遇到问题。
AutoLayout requires a fixed Height Constraint for the UITableView, so the Height does not change when I add or remove
TableViewCells
.
我的问题是,我使用的是 TableView
inside ScrollView
。这不是很好,因为 两个元素都是可滚动的。
My Plan is to always resize the TableView in relation to its content Height. In this case the TableView can never get scrolled.
到目前为止,我的想法如下,但由于某些原因,它并没有真正起作用:
tableView.frame = CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: tableView.contentSize.height)
如果您对如何解决此问题有任何想法,请在下方发表评论。 首选没有 class 扩展等的简单解决方案;)
非常感谢你们!
您可以按照以下方式使用:
final class AutoSizingTableView: UITableView {
override init(frame: CGRect, style: UITableView.Style) {
super.init(frame: frame, style: style)
setContentCompressionResistancePriority(.required, for: .vertical)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setContentCompressionResistancePriority(.required, for: .vertical)
}
override var contentSize: CGSize {
didSet {
invalidateIntrinsicContentSize()
}
}
override func reloadData() {
super.reloadData()
invalidateIntrinsicContentSize()
}
override var intrinsicContentSize: CGSize {
setNeedsLayout()
layoutIfNeeded()
return contentSize
}
}
基本上,当重新加载 tableview 的数据或 contentSize 发生变化时,将 intrinsicContentSize 设置为等于 contentSize。
但是你必须问自己这个问题:如果我不需要出队逻辑,我真的需要一个表视图吗?
您需要重写 UIViewController 中的 updateViewConstraints()
方法并设置 tableView
的新高度,如下所示:
override func updateViewConstraints() {
tableViewHeightConstraint?.constant = tableView.contentSize.height
super.updateViewConstraints()
}
并在您需要使用新高度重新创建 tableView
时调用 self.view.setNeedsUpdateConstraints()
。