在自定義鍵盤的時候,碰到要根據(jù)橫豎屏,然后改變自定義鍵盤高度的需求,但是發(fā)現(xiàn),無論使用autolayout還是設(shè)置frame去改變高度,都沒有反應(yīng)。后面經(jīng)過查閱,才知道有個Intrinsic Content Size屬性。可以設(shè)置視圖的自定義大小。
關(guān)于 intrinsicContentSize 及 約束優(yōu)先級/content Hugging/content Compression Resistance的詳解,參考如下博客:
https://blog.csdn.net/sodaslay/article/details/78942940
下面是自己的簡單記錄:
改變自定義鍵盤的高度可以設(shè)置鍵盤View的視圖Intrinsic Content Size屬性。
先設(shè)置屬性:
//如果為YES,在AutoLayout中則會自動將view的frame和bounds屬性轉(zhuǎn)換為約束。
self.translatesAutoresizingMaskIntoConstraints = NO;
然后再調(diào)用方法:
[self invalidateIntrinsicContentSize];
大概demo如下:
//IntrinsicView.m
#import "IntrinsicView.h"
static bool closeIntrinsic = false;//測試關(guān)閉Intrinsic的影響
@implementation IntrinsicView
- (instancetype)init
{
self = [super init];
if (self) {
//不兼容舊版Autoreizingmask,只使用AutoLayout
//如果為YES,在AutoLayout中則會自動將view的frame和bounds屬性轉(zhuǎn)換為約束。
self.translatesAutoresizingMaskIntoConstraints = NO;
}
return self;
}
//當用戶設(shè)置extendSize時,提示系統(tǒng)IntrinsicContentSize變化了。
-(void)setExtendSize:(CGSize)extendSize{
_extendSize = extendSize;
//如果不加這句話,在view顯示之后(比如延時幾秒),再設(shè)置extendSize不會有效果。
//本例中也就是testInvalidateIntrinsic的方法不會產(chǎn)生預(yù)期效果。
[self invalidateIntrinsicContentSize];
}
//通過覆蓋intrinsicContentSize函數(shù)修改View的Intrinsic的大小
-(CGSize)intrinsicContentSize{
if (closeIntrinsic) {
return CGSizeMake(UIViewNoIntrinsicMetric, UIViewNoIntrinsicMetric);
} else {
return CGSizeMake(_extendSize.width, _extendSize.height);
}
}
@end