iOS intrinsicContentSize内置尺寸

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS intrinsicContentSize内置尺寸相关的知识,希望对你有一定的参考价值。

参考技术A

一个控件在项目中的展现一般由两种东西来决定,一个是 坐标 ,一个是 尺寸大小

但在日常开发中,对于UILabel或UIButton等控件来说,给定其坐标而不给尺寸大小,只是用 sizeToFit 同样可以将视图展现出来,就是因为UILabel或UIButton已经由其控件的展示内容计算决定了它的控件合理的内置尺寸大小

但对于某些特定情况如在 MBProgressHUD 添加自定义视图时,若给定视图为不确定大小的图片,展示出来的效果就很差强人意,这时就需要更改对应View中的内置大小来适配合适的尺寸

MBProgressHUD 中已经提示需执行view的 intrinsicContentSize 属性
The view should implement intrinsicContentSize for proper sizing.

而 intrinsicContentSize 为 只读 属性,外部无法直接给定更改的尺寸
此时需要在相应View中指定 intrinsicContentSize 方法,重写 UIView 中的 - (CGSize)intrinsicContentSize 方法,来更改相应控件的内置尺寸大小,告知系统值已改变,这时的view的展示大小就可符合相应的设计要求

iOS Auto Layout intrinsicContentSize 内容大小

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];
   

以上是关于iOS intrinsicContentSize内置尺寸的主要内容,如果未能解决你的问题,请参考以下文章

iOS intrinsicContentSize内置尺寸

基于 `intrinsicContentSize` 的自动布局纵横比(非恒定)

intrinsicContentSize.width 的值大于指定的 widthAnchor

Swift - 没有按时调用intrinsicContentSize

UIStackView自己的intrinsicContentSize

修改 `UITableView` 和 `UICollectionView` 的 `intrinsicContentSize` 方法可以吗?