【问题标题】:Does systemLayoutSizeFittingSize: require setNeedsLayout & layoutIfNeeded before it?systemLayoutSizeFittingSize: 之前需要 setNeedsLayout 和 layoutIfNeeded 吗?
【发布时间】:2015-03-21 10:06:24
【问题描述】:

一些 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;
}

谢谢。

【问题讨论】:

  • 我正在调查同样的事情,有没有得出结论?谢谢!
  • :-) 不!我很确定我读过一些相关的东西,但我现在找不到。我考虑过给它一个赏金,但我不确定我是否那么在意它。对不起。

标签: uiview autolayout


【解决方案1】:

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

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

【讨论】:

  • 我在 SO 上看到的每个解决方案都是这样工作的。你碰巧知道另一种实现它的方法吗? (不调用 layoutIfNeeded)
  • 是的,不要调用layoutIfNeeded?最初的问题也说了这么多:“没有额外的电话,它似乎工作得很好”。所以我要问的问题是:您是否看到某处需要返回正确的值,如果是,您能否提供更多详细信息?
  • 是的。在表格视图单元格和集合视图单元格的情况下。似乎已经完成,因为没有为单元格指定宽度锚。我想我现在明白了这种方法是如何工作的。
【解决方案2】:

layoutIfNeeded 似乎是对在使用 systemLayoutSizeFittingSize 时看到高度计算不一致的全面响应 - 问题是当值不正确时很难调试

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

【讨论】:

    猜你喜欢
    • 2014-01-03
    • 2015-05-08
    • 1970-01-01
    • 2020-12-18
    • 2020-11-03
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    • 2020-02-12
    相关资源
    最近更新 更多