为什么 - [UILabel setText]会导致即时重播?

时间:2017-03-30 04:33:53

标签: ios autolayout

我有复杂的UICollectionViewCell,上面有大约10个标签。所以我需要在显示之前用数据填充它们,所以我在collectionView:cellForItemAtIndexPath:方法中完成它。标签不是固定宽度,并且有一些非必需(优先级小于1000)约束,因此某些标签可以缩小。 每个setText调用会导致invalidateIntrinsicContentSize,我认为可以将其标记为无效以使布局在下一个布局过程中发生,但我很惊讶它会对约束进行一些额外的工作,所以滚动真的很棒慢。

instruments screenshot

为什么要做这项额外的工作?在设置所有标签文本或下一个布局通过后,有没有办法在我的命令中只执行一个?

在iOS 6上滚动非常慢,iOS 8+工作正常。

1 个答案:

答案 0 :(得分:0)

我仍然没有回答“为什么”它的行为与提到的相似,但我找到了解决方法:我继承UILabel并在我知道我不需要内在大小时使用它。这节省了50%的时间用于重新计算布局。

@interface NoIntrinsicSizeLabel : UILabel
@end
@implementation NoIntrinsicSizeLabel
- (void)invalidateIntrinsicContentSize {
    return;
}
@end