为什么setNeedsLayout()+ layoutIfNeeded()并不总是触发布局传递?

时间:2017-01-24 17:16:40

标签: ios uitableview layout autolayout layoutsubviews

一个简单的实验:

我有一个UITableView,其中包含以下数据源方法:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let identifier = "MyCellID"
    let cell = tableView.dequeueReusableCell(withIdentifier: identifier, for: indexPath) 
               as! MyCustomCell

    cell.setNeedsLayout()
    cell.layoutIfNeeded()

    cell.setNeedsLayout()
    cell.layoutIfNeeded()

    return cell
}

在我的子表格视图单元格中,我重写layoutSubviews(),如下所示:

class MyCustomCell: UITableViewCell {

    override func layoutSubviews() {
        super.layoutSubviews()
        print("Cell did layout its subviews.")
    }
}

当表视图通过调用数据源上的tableView(_:cellForRowAt:)来请求新的可重用单元时,控制台中的日志输出仅为

  

Cell did layout its subviews.

该单元格。

为什么这条线不打印两次?

我的理解是,在任何视图上调用setNeedsLayout()都会使该视图的布局无效,并且调用layoutIfNeeded()会触发布局传递 - 即调用layoutSubviews() - 当且仅当布局无效。因此,调用两个方法

setNeedsLayout()
layoutIfNeeded()

应始终导致layoutSubviews()来电。我在这里推理的错误是什么?

0 个答案:

没有答案