view的属性intrinsicContentSize,layoutMargins,preservesSuperviewLayoutMargins对于autolayout的效果

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里面调整

iOS自定义View 控件自动计算size能力

你可能感兴趣的:(view的属性intrinsicContentSize,layoutMargins,preservesSuperviewLayoutMargins对于autolayout的效果)