systemLayoutSizeFittingSize:在它之前需要setNeedsLayout和layoutIfNeeded吗?

Ben*_*ohn 5 uiview autolayout

许多SO问题显示了一种自动布局技术,用于确定视图所需的最小大小,以满足其约束条件: [header systemLayoutSizeFittingSize: UILayoutFittingCompressedSize]

systemLayoutSizeFittingSize:打电话之前,我见过的所有例子都强制进行布局更新,如下所示:

[view setNeedsLayout];
[view layoutIfNeeded];
CGFloat height = [view systemLayoutSizeFittingSize: UILayoutFittingCompressedSize].height;
Run Code Online (Sandbox Code Playgroud)

我想知道什么时候这实际上是必要的,因为它看起来像是一种仪式调料:我想知道为什么我打电话,而不是为了运气!

我刚刚systemLayoutSizeFittingSize:在一些代码中使用了我有选择地更新一个UITableView实例的视图tableViewHeader(不是节头),然后调整它的大小.没有额外的电话,它似乎工作正常.我有这个viewDidLoad:

{
    // Remove the view that we don't want.
    [self.autoPopulateView removeFromSuperview];

    // Resize the table's header view now the unwanted view is removed.
    UIView *const header = self.tableView.tableHeaderView;

    // Don't explicitly layout.
    // [header setNeedsLayout];
    // [header layoutIfNeeded];

    CGFloat height = [header systemLayoutSizeFittingSize: UILayoutFittingCompressedSize].height;
    CGRect frame = header.frame;
    frame.size.height = height;
    header.frame = frame;
}
Run Code Online (Sandbox Code Playgroud)

谢谢.

len*_*vet 0

在调用 systemLayoutSizeFittingSize 之前绝对不需要进行其中任何一个调用。只要所有限制都已到位,您就不需要执行任何其他操作。

事实上,从性能的角度来看,预先强制进行布局传递可能是有害的,而且我认为这样做不仅是不必要的,而且实际上是有害的。