动态 UITableView 高度与 UIScrollView 中的动态 UITableViewCells
Posted
技术标签:
【中文标题】动态 UITableView 高度与 UIScrollView 中的动态 UITableViewCells【英文标题】:Dynamic UITableView height with dynamic UITableViewCells in UIScrollView 【发布时间】:2018-04-06 14:33:28 【问题描述】:我对如何实现(或者甚至可能)使用动态 UITableViewCells 实现动态 UITableView 高度有疑问。所以,我有一些像新闻细节这样的东西,上面有一些视图(图片、标签等),下面是我想要制作 cmets 部分的所有内容。评论滚动是错误的,我需要调整整个 tableview 和整个屏幕的大小以匹配所有内容大小。我知道 tableView 是 scrollView,我可以制作整个新闻详细信息视图,如 tableview,其中标题将是所有视图(如图像、标签等)。
但是我可以让它像这样工作吗?我制作了具有 [图像(具有固定高度)、标签等和 cmets tableView(需要具有内容大小高度,不可滚动)] 的 View(内容视图)] 我尝试使用
tableView.isScrollEnabled = false
tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 220
override func viewWillLayoutSubviews()
super.updateViewConstraints()
self.tableViewHeight?.constant = self.tableView.contentSize.height
但没有运气。唯一发生的事情是我得到了由公式 rows.count *estimatedRowHeight 计算的内容大小,所以有时我会削减一些内容,有时我会在表格下方得到如此多的空白空间。谢谢!
编辑:这是解决方案
class ViewController: UIViewController
@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var tableViewHeight: NSLayoutConstraint!
private var contentSizeObservation: NSKeyValueObservation?
override func viewDidLoad()
super.viewDidLoad()
tableView.isScrollEnabled = false
tableView.dataSource = self
contentSizeObservation = tableView.observe(\UITableView.contentSize, options: [.new]) (_, change) in
if let newSize = change.newValue
self.tableViewHeight.constant = newSize.height
【问题讨论】:
【参考方案1】:我认为你只需要一个 UITableView。只需将您的 cmets 添加为单元格并将您的新闻详细信息设置为 tableHeaderView
:https://developer.apple.com/documentation/uikit/uitableview/1614904-tableheaderview。
如果你想在 TableView 标题中使用 AutoLayout,你必须做一些变通方法,但仍然相当简单,你会在 *** 上找到很多关于它的主题。就我而言,我为 UITableView 创建了简单的扩展:
internal extension UITableView
/// Workaround for not working AutoLayout with UITableView.tableHeaderView
/// This function needs to be called after calculating TableView position
/// In case of UIViewController: viewDidLayoutSubviews()
/// In case of UIView: layoutSubviews()
func relayoutTableHeaderView()
guard let tableHeaderView = tableHeaderView else return
tableHeaderView.layoutIfNeeded()
tableHeaderView.frame.size = tableHeaderView.systemLayoutSizeFitting(UILayoutFittingCompressedSize)
self.tableHeaderView = tableHeaderView
标题和单元格都可以使用 AutoLayout 动态计算
【讨论】:
以上是关于动态 UITableView 高度与 UIScrollView 中的动态 UITableViewCells的主要内容,如果未能解决你的问题,请参考以下文章