【问题标题】:iOS UITableView tableHeaderView resizes after transition/reappeariOS UITableView tableHeaderView 在转换/重新出现后调整大小
【发布时间】: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 中的大小,因为它会触发无限循环。

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

【问题讨论】:

    标签: ios uitableview


    【解决方案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()解决问题。

      【讨论】:

        猜你喜欢
        • 2010-09-25
        • 1970-01-01
        • 2018-05-16
        • 1970-01-01
        • 2017-11-05
        • 1970-01-01
        • 2012-10-29
        • 1970-01-01
        • 2014-03-12
        相关资源
        最近更新 更多