在自定义键盘的时候,碰到要根据横竖屏,然后改变自定义键盘高度的需求,但是发现,无论使用autolayout还是设置frame去改变高度,都没有反应。后面经过查阅,才知道有个Intrinsic Content Size属性。可以设置视图的自定义大小。
关于 intrinsicContentSize 及 约束优先级/content Hugging/content Compression Resistance的详解,参考如下博客:
https://blog.csdn.net/sodaslay/article/details/78942940
下面是自己的简单记录:
改变自定义键盘的高度可以设置键盘View的视图Intrinsic Content Size属性。
先设置属性:
//如果为YES,在AutoLayout中则会自动将view的frame和bounds属性转换为约束。
self.translatesAutoresizingMaskIntoConstraints = NO;
然后再调用方法:
[self invalidateIntrinsicContentSize];
大概demo如下:
//IntrinsicView.m
#import "IntrinsicView.h"
static bool closeIntrinsic = false;//测试关闭Intrinsic的影响
@implementation IntrinsicView
- (instancetype)init
{
self = [super init];
if (self) {
//不兼容旧版Autoreizingmask,只使用AutoLayout
//如果为YES,在AutoLayout中则会自动将view的frame和bounds属性转换为约束。
self.translatesAutoresizingMaskIntoConstraints = NO;
}
return self;
}
//当用户设置extendSize时,提示系统IntrinsicContentSize变化了。
-(void)setExtendSize:(CGSize)extendSize{
_extendSize = extendSize;
//如果不加这句话,在view显示之后(比如延时几秒),再设置extendSize不会有效果。
//本例中也就是testInvalidateIntrinsic的方法不会产生预期效果。
[self invalidateIntrinsicContentSize];
}
//通过覆盖intrinsicContentSize函数修改View的Intrinsic的大小
-(CGSize)intrinsicContentSize{
if (closeIntrinsic) {
return CGSizeMake(UIViewNoIntrinsicMetric, UIViewNoIntrinsicMetric);
} else {
return CGSizeMake(_extendSize.width, _extendSize.height);
}
}
@end