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))
据我所知,我无法控制的某些事情在viewDidAppear
和viewDidLayoutSubviews
之间改变了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
...
...
然后,重写UITableViewController
的updateViewConstraints()
方法来附加约束:
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 时断言失败