Uiview systemLayoutSizeFittingSize:是否需要设置NeedsLayout&;在它之前需要布局吗?

Uiview systemLayoutSizeFittingSize:是否需要设置NeedsLayout&;在它之前需要布局吗?,uiview,autolayout,Uiview,Autolayout,许多S.O.问题显示了一种自动布局技术,用于确定视图满足其约束所需的最小大小:[header systemLayoutSizeFittingSize:UILayoutFittingCompressedSize] 在进行systemLayoutSizeFittingSize:调用之前,我看到的所有示例都强制进行布局更新,如下所示: [view setNeedsLayout]; [view layoutIfNeeded]; CGFloat height = [view systemLayoutSiz

许多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;
}

谢谢。

在调用systemLayoutSizeFittingSize之前,绝对不需要进行这两种调用。只要所有的约束都到位,就不需要做任何其他事情


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

显然,当使用
systemLayoutSizeFittingSize
时,
layoutfneeded
是对高度计算不一致的一种全面反应-问题是该值不正确时很难调试


根据我的经验,每当目标视图更新代码中的约束(例如更改常量、添加或删除约束)时,都需要调用
layoutifneed
。调用
setNeedsLayout
setNeedsUpdateConstraints
不起作用(耸耸肩)

我正在调查同样的事情,有没有得出结论?谢谢!:-)不我很确定我读过一些相关的东西,但我现在找不到。我想悬赏,但我不确定我是否真的那么在乎。对不起,我在上面看到的每个解决方案都是这样的。你知道实现它的另一种方法吗?(没有呼叫layoutifneed)是的,不要呼叫layoutifneed?最初的问题也是这样说的:“没有额外的电话,它似乎工作得很好”。所以我想问的问题是:您是否看到需要返回正确值的地方,如果是,您能否提供更多详细信息?是的。对于表视图单元格和集合视图单元格。似乎这样做是因为没有为单元格指定宽度锚点。我想我现在明白了这个方法的工作原理。