Uiview systemLayoutSizeFittingSize:是否需要设置NeedsLayout&;在它之前需要布局吗?
许多S.O.问题显示了一种自动布局技术,用于确定视图满足其约束所需的最小大小:Uiview systemLayoutSizeFittingSize:是否需要设置NeedsLayout&;在它之前需要布局吗?,uiview,autolayout,Uiview,Autolayout,许多S.O.问题显示了一种自动布局技术,用于确定视图满足其约束所需的最小大小:[header systemLayoutSizeFittingSize:UILayoutFittingCompressedSize] 在进行systemLayoutSizeFittingSize:调用之前,我看到的所有示例都强制进行布局更新,如下所示: [view setNeedsLayout]; [view layoutIfNeeded]; CGFloat height = [view systemLayoutSiz
[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?最初的问题也是这样说的:“没有额外的电话,它似乎工作得很好”。所以我想问的问题是:您是否看到需要返回正确值的地方,如果是,您能否提供更多详细信息?是的。对于表视图单元格和集合视图单元格。似乎这样做是因为没有为单元格指定宽度锚点。我想我现在明白了这个方法的工作原理。