intrinsicContentSize 内在内容大小
使用AutoLayout 时,视图内容的大小通过每个视图的 intrinsicContentSize 属性表达,它描述了在数据未经压缩或剪裁的情况下表达视图全部内容所需的最小空间。该属性源于每个视图所呈现内容的自然属性。
对于图像视图,内在内容大小与其呈现的图像大小相符。图像越大,需要的内容大小也越大。
对于按钮,内在内容的大小随着按钮的名称而变化(title)。
通过视图的内在内容大小,Auto Layout将视图框架尽可能地与其自然内容相匹配。无歧义的布局通常需要给每个坐标轴设置两个属性,当视图有一个内在内容大小时,则只需设置两个属性中的一个。
当改变了视图的内在内容时,需要调用 invalidateIntrinsicContentSize 方法,让AutoLayout 知道在下次布局时重新计算。
例子1:
#import "XJYLabel.h"
@implementation XJYLabel
- (instancetype)init {
if (self = [super init]) {
}
return self;
}
- (CGSize)intrinsicContentSize {
return CGSizeMake(100, 100);
}
@end
例子2:
#pragma mark - Layout
// 如果原有的视图尺寸和现在的不相符,
- (void)layoutSubviews {
[super layoutSubviews];
_collectionView.frame = self.bounds;
if (!CGSizeEqualToSize(self.bounds.size, [self intrinsicContentSize])) {
[self invalidateIntrinsicContentSize];
}
}
- (CGSize)intrinsicContentSize {
return _layout.collectionViewContentSize;
}
#pragma mark - Public methods
- (void)reload {
[_collectionView reloadData];
[self invalidateIntrinsicContentSize];
}