使用自动布局计算 tableHeaderView 高度

Calculate tableHeaderView height with autolayout

这是我的 xib 文件:

如您所见,我有一个 UITableView 和一个 tableHeaderView(橙色)!在运行时一切都显示正确,除非标题标签有多行,而不是 UILabel 被典型的“..”截断。我已经将 numberOfLines 更改为 0!

我认识到问题是整个tableHeaderView 的高度!这就是我在代码中计算高度的方式:

[self.headerView setNeedsLayout];
[self.headerView layoutIfNeeded];

CGFloat height = [self.headerView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height + self.headerView.frame.origin.y;

CGRect headerFrame = self.headerView.frame;
headerFrame.size.height = height;
self.headerView.frame = headerFrame;

[self.tableView setTableHeaderView:self.headerView];

但在运行时,tableHeaderView 太小,无法显示 2 或 3 或 4...行的标题标签。可能是什么问题?

我认为您过于努力地让您的内容适合 table 视图 header,该视图旨在包含相对较小的 static 内容。

假设您想要 table 视图停留在橙色视图的底部,并且橙色视图随 table 视图滚动(即不停留在顶部屏幕),我会添加橙色视图和 table 视图的滚动视图 parent,并禁用 table 视图滚动功能。

这意味着将 UITableViewController 换成 UIViewController。

例如

-- UIScrollView
  |
  -- UIView (orange view)
  | |
  | -- subview 1
  | -- subview 2
  | -- etc.
  |
  -- UITableView (scrollEnabled = NO)

使用 AutoLayout,您可以使橙色视图自动调整大小以适合其内容,这将 "push" UITableView 缩小。 当用户垂直滑动时,根滚动视图将捕获事件,并相应地滚动整个 (orangeView + tableView),产生与橙色视图相同的效果,就好像橙色视图是 table 视图 header.

动态设置 tableHeaderView 高度

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    if let headerView = tableView.tableHeaderView {

        let height = headerView.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize).height
        var headerFrame = headerView.frame

        //Comparison necessary to avoid infinite loop
        if height != headerFrame.size.height {
            headerFrame.size.height = height
            headerView.frame = headerFrame
            tableView.tableHeaderView = headerView
        }
    }
}

post: https://newbedev.com/setting-tableheaderview-height-dynamically