高度自适应

1,109 阅读1分钟

记录控件自适应相关内容

TextView

需求是TextView根据内容自适应宽高,但有最大200,最小100的限制要求。

通过自定义textView实现:

Intrinsic Content Size:固有大小。在AutoLayout中如果没有指定大小,它就按照这个大小来设置。 比如 UILabel UIImageView UIButton等组件,都只需要设置位置而不设大小即可。

@implementation EWTextView

-(void)setContentSize:(CGSize)contentSize{
    [super setContentSize:contentSize];

    [self invalidateIntrinsicContentSize];
}
-(CGSize)intrinsicContentSize{
    NSLog(@"%@",NSStringFromCGSize(self.contentSize));
    if (self.contentSize.height <= 100) {
        return CGSizeMake(self.contentSize.width, 100);
    }else if(self.contentSize.height > 200){
        return CGSizeMake(self.contentSize.width, 200);
    }
    return self.contentSize;
}
@end

使用

- (void)viewDidLoad {
    
    [super viewDidLoad];
    
    EWTextView *textview = [[EWTextView alloc]init];
    textview.backgroundColor = [UIColor redColor];
    [self.view addSubview:textview];

    [textview mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.equalTo(@20);
        make.top.equalTo(@100);
        make.right.equalTo(@-100);
        
    }];
}

Intrinsic 冲突

如下图示两个Label 均有Intrinsic contentsize 对Label2 增了跟右侧的约束,则会出现 Intrinsic 冲突。 iShot2021-04-09 18.14.08.png iShot2021-04-09 18.13.32.png 解决

  1. 两个UILabel都放弃使用Intrinsic,为它们设置宽高。
  2. 其中一个UILabel 使用 Intrinsic contentsize,另一个使用剩余宽度。

content Hugging

约束(不想变大约束)表示:如果组件的此属性优先级比另一个组件此属性优先级高的话,那么这个组件就保持不变,另一个可以在需要拉伸的时候拉伸。属性分横向和纵向2个方向。

Content Compression Resistance

约束(不想变小约束)表示:如果组件的此属性优先级比另一个组件此属性优先级高的话,那么这个组件就保持不变,另一个可以在需要压缩的时候压缩。属性分横向和纵向2个方向。

两个 UIlabel 例子中,如果某个UILabel使用Intrinsic Content Size的时候,另一个需要拉伸。 所以我们需要调整两个UILabel的 Content Hugging约束的优先级就可以。

iShot2021-04-09 18.26.02.png