intrinsicContentSize 字面意思是指view的固有大小;
这个属性发挥的空间就是在autolayout布局时会自己计算view的大小,view的子类都可以在autolayout布局时只需要给位置,不需要确定大小,就是因为有它;
所以可以通过继承去重写这个属性去给它一个你想要的大小,拿button举例
- (instancetype)init
{
self = [super init];
if (self) {
//不兼容旧版Autoreizingmask,只使用AutoLayout
//如果为YES,在AutoLayout中则会自动将view的frame和bounds属性转换 为约束。
self.translatesAutoresizingMaskIntoConstraints = NO;
}
return self;
}
- (CGSize) intrinsicContentSize {
CGSize s = [super intrinsicContentSize];
CGFloat w = s.width + self.titleEdgeInsets.left + self.titleEdgeInsets.right;
CGFloat h = s.height + self.titleEdgeInsets.top + > self.titleEdgeInsets.bottom;
return CGSizeMake(w,h);
}
可以调整文字的内边距,又不会影响文字的显示,对于UI细节的打磨有一些帮助
当你设置了控件大小这个属性接口的重写就不会生效了,我多次实验的出来的结果,至于原因我也想知道,哈哈
layoutMargins是指父控件对于子控件的关系,默认是(8,8,8,8),注意点是父控件不能是系统自带的比如ViewController的view,系统控件设置无效,父控件为自定义控件时设置layoutmargin,子控件约束依赖父控件的margin就可以达到控制子控件相对于父控件类似于内边距的效果
preservesSuperviewLayoutMargins是和layoutmargin搭配使用,默认为false,就是控制子控件对于父控件margin的约束是否受父控件的父控件的layoutmargin效果的影响
总结
intrinsicContentSize 这个属性是在没有给出控件大小为前提(简单点就是frame布局就不会调用)的情况下 ,控价本身计算自己大小的会调用的一个接口,重写这个接口可以实现一些想要的控件内容的操作,以上都是只对autolayout有效,frame设置建议去layoutsubviews里面调整