iOS UITableView tableHeaderView 在转换/重新出现后调整大小

Posted

技术标签:

【中文标题】iOS UITableView tableHeaderView 在转换/重新出现后调整大小【英文标题】:iOS UITableView tableHeaderView resizes after transition/reappear 【发布时间】:2015-06-11 22:37:52 【问题描述】:

我有一些奇怪的行为。我正在设置一个 tableHeaderView 如下:

class MyTableViewController: UITableViewController 
    ...
    override func viewDidLoad() 
        ...
        var myHeaderView = NSBundle.mainBundle().loadNibNamed("MyHeaderView", owner: self, options: nil).first as? MyHeaderView
        tableView.tableHeaderView = myHeaderView
        ...
    
    ...

当视图第一次加载时,它会正确显示。自动布局给它的高度为30,并且表头高度也随之而来。

当我转到另一个视图时(通过点击UITableView 中的单元格),然后点击返回按钮,UITableView 也会以正确的高度绘制。

但是,在所有内容正确加载后的一瞬间,tableViewHeader 会自行调整大小并覆盖第一个单元格的一部分。这非常令人沮丧,因为我似乎无法弄清楚它发生在哪里。

我添加了一些日志行。这是点击后退按钮后的样子:

viewWillAppear: header frame is Optional((0.0, 0.0, 375.0, 30.0))
viewDidLayoutSubviews: header frame is Optional((0.0, 0.0, 375.0, 30.0))
viewDidAppear: header frame is Optional((0.0, 0.0, 375.0, 30.0))
viewDidLayoutSubviews: header frame is Optional((0.0, 0.0, 375.0, 49.0))
viewDidLayoutSubviews: header frame is Optional((0.0, 0.0, 375.0, 49.0))

据我所知,我无法控制的某些事情在viewDidAppearviewDidLayoutSubviews 之间改变了tableViewHeader 的高度。我无法更正 viewDidLayoutSubviews 中的大小,因为它会触发无限循环。

我不知道该怎么做才能解决这个问题。在视图重新出现之前,一切似乎/表现都很好。它还会在向​​/从横向过渡时破坏正确的高度。

【问题讨论】:

【参考方案1】:

找到了似乎可以解决此问题的解决方法。 (启发by this post。)问题似乎是自动调整大小的掩码和自动布局的组合导致UITableView 如何尝试确定标题大小的一些混乱。因此,一个不错的选择是使用自动布局将标题视图连接到父表视图。

首先,将TranslatesAutoresizingMaskIntoConstraints 设置为false

class MyTableViewController: UITableViewController 
    ...
    var _myHeaderView: MyHeaderView!
    ...
    override func viewDidLoad() 
        ...
        _myHeaderView = NSBundle.mainBundle().loadNibNamed("MyHeaderView", owner: self, options: nil).first as! MyHeaderView
        myHeaderView.setTranslatesAutoresizingMaskIntoConstraints(false)
        tableView.tableHeaderView = myHeaderView
        ...
    
    ...

然后,重写UITableViewControllerupdateViewConstraints()方法来附加约束:

override func updateViewConstraints() 
    var viewDictionary = ["headerView": _myHeaderView]
    _myHeaderView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:[headerView(30)]", options: nil, metrics: nil, views: viewDictionary))
    tableView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:[headerView(==tableView)]", options: nil, metrics: nil, views: ["headerView": _myHeaderView, "tableView": tableView]))
    tableView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-0-[headerView]", options: nil, metrics: nil, views: viewDictionary))
    tableView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-0-[headerView]", options: nil, metrics: nil, views: viewDictionary))

    super.updateViewConstraints()

这将很好地响应视图调整大小等。

【讨论】:

【参考方案2】:

您可以拨打tableview.reloadData()解决问题。

【讨论】:

以上是关于iOS UITableView tableHeaderView 在转换/重新出现后调整大小的主要内容,如果未能解决你的问题,请参考以下文章

如何在 jQuery 导出时将 dataTables 中的所有 tableHeader 值更改为大写

使用 tableHeader TVOS 重新加载 tableView 时断言失败

React几种函数的写法

当antd Table Head高度不确定,动态计算满屏时Table scroll y的高度。

IOS-UITableView入门

iOS 编辑UITableView(根据iOS编程编写)