许多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;
}
感谢。
答案 0 :(得分:0)
在调用systemLayoutSizeFittingSize之前,绝对不需要进行其中任何一个调用。只要您的所有约束都存在,您就不需要做任何其他事情。
事实上,从性能的角度来看,强制布局通行证可能是有害的,我认为这样做不仅是不必要的,而且实际上是有害的。
答案 1 :(得分:0)
肯定看来layoutIfNeeded
对于在使用systemLayoutSizeFittingSize
时看到高度计算的不一致是一个全面的回应 - 问题是当它的值不正确时,该值很难调试
根据我的经验,只要目标视图更新了代码中的约束,就需要调用layoutIfNeeded
,例如更改常量,添加,删除约束。致电setNeedsLayout
或setNeedsUpdateConstraints
不起作用(耸肩)