systemLayoutSizeFittingSize:require setNeedsLayout& layoutIfNeeded之前呢?

时间:2015-01-22 14:53:51

标签: uiview autolayout

许多S.O.问题显示自动布局技术,以确定视图所需的最小尺寸,以满足其约束:[header systemLayoutSizeFittingSize: UILayoutFittingCompressedSize]

在进行systemLayoutSizeFittingSize:调用之前,我见过的所有示例都强制进行布局更新,如下所示:

[view setNeedsLayout];
[view layoutIfNeeded];
CGFloat height = [view systemLayoutSizeFittingSize: UILayoutFittingCompressedSize].height;

我想知道什么时候这实际上是必要的,因为它似乎作为一种仪式调味品:我想知道为什么我打电话,而不是为了运气!

我刚刚在一些代码中使用了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;
}

感谢。

2 个答案:

答案 0 :(得分:0)

在调用systemLayoutSizeFittingSize之前,绝对不需要进行其中任何一个调用。只要您的所有约束都存在,您就不需要做任何其他事情。

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

答案 1 :(得分:0)

肯定看来layoutIfNeeded对于在使用systemLayoutSizeFittingSize时看到高度计算的不一致是一个全面的回应 - 问题是当它的值不正确时,该值很难调试

根据我的经验,只要目标视图更新了代码中的约束,就需要调用layoutIfNeeded,例如更改常量,添加,删除约束。致电setNeedsLayoutsetNeedsUpdateConstraints不起作用(耸肩)