当前位置: 移动技术网 > 移动技术>移动开发>IOS > iOS中的AutoLayout使用实践总结

iOS中的AutoLayout使用实践总结

2019年07月24日  | 移动技术网移动技术  | 我要评论
前言 autolayout非常强大也非常易用,可读性也很强,加上各种第三方autolayout库,让你布起局来犹如绷掉链子的狗!但在使用中也有各种各样的问题,下面就来给大

前言

autolayout非常强大也非常易用,可读性也很强,加上各种第三方autolayout库,让你布起局来犹如绷掉链子的狗!但在使用中也有各种各样的问题,下面就来给大家详细介绍下。

autolayout 问题

  • 布局冲突
  • 固有尺寸冲突
  • 布局和固有尺寸冲突

主要概念

  • 固有尺寸 intrinsiccontentsize(意思就是说我知道自己的大小,如果你没有为我指定大小,我就按照这个大小来。)
  • hugging,compress
  • priority
  • constraint:equal,unequal

一个uiview显示,需要有2个元素,position & size。autolayout可以确定view 的这两个,so 不用frame。

1、布局遇到的问题

布局绝对冲突:

eg 设置了 view 的左右,然后又有个 width,造成冲突

   解决方案:

    1.设置优先级(低优先级constraint没有用到的时候的时候系统默认忽略)

    2.删除没有的constraint(常用)

2、布局模糊冲突

    假设uiview2的宽度不能超过50。当uiview1宽度小于50的时候,二者等宽;

    当uiview1宽度大于50的时候,uiview2不受uiview1宽度的影响。 

    于是给uiview2加上一条约束:宽度<=50。这时候冲突来了:

因为uiview1的宽度是定好的,而uiview2和uiview1等宽。那么uiview2的宽度就是确定的。

    so 当宽度 > 50 的时候,就是冲突,<= 50 的时候就不是冲突

    解决方案:

        equal width priority 设置低一些,这样让 view2 先满足<= 50的 constraint,当他的width <= 50 的时候equal width生效

enum {
 uilayoutpriorityrequired = 1000,
 uilayoutprioritydefaulthigh = 750,
 uilayoutprioritydefaultlow = 250,
 uilayoutpriorityfittingsizelevel = 50,
};

1、intrinsic冲突

content hugging/content compression resistance 设置优先级解决intrinsiccontentsize

  • hugging (不想填充空间)
  • compression (不想被挤压)
  • 有这两个特性的 view 一定实现了 intrinsiccontentsize
  • hugging 默认 priority = 250
  • compression 默认 priority = 750
  • 其他 constraint 默认 priority = 1000(最大)

当 constraint.priority > hugging.priority view会被拉伸

当 constraint.priority < hugging.priority view会被抱紧在priority小的那一边

当 constraint.priority > compression.priority view 会被挤压

当 constraint.priority < compression.priority view 不会被挤压

    eg uilabel 有intrinsiccontentsize 那么uilabel的size 就用它,

    如果有constraint 设置了 size 那么使用 constraint的

    uilabel1、和uilabel2布局 :

    距离上边栏都是50点。 uilabel1与左边栏距离为10,uilabel2左面距离uilabel1为10点。

    因为都具有intrinsic属性,所以不需要指定size,位置应该也明确了。

    再给uilabel2加一条约束,右侧距离右边栏为10点。(如果view 没有intrinsiccontentsize,那么右边的view 会被拉伸)

    因为 uilabel 有intrinsiccontentsize 所以2个labe 必须有一个要被拉伸

    * 1个label 使用自己的intrinsic,另一个填充其他空间

使用场景

1、没有 intrinsiccontentsize 的view 使用 priority,将模糊冲突改变成条件布局

2、有 intrinsiccontentsize 的view

       改变hugging or compression 的priority,解决intrinsic 冲突

       虽然有intrinsic 只要给出origin 和 size 就可以了,可是使用 unequal constraint 完善布局,避免警告

       主要接口 & 属性

uilabel 的preferredmaxlayoutwidth,如果有多行要设置正确的preferredmaxlayoutwidth,来得到 正确的intrinsiccontentsize

systemlayoutsizefittingsize 调用 intrinsiccontentsize

layoutifneed 如果有布局变化强制刷新

当视图的内在内容改变时,需要调用 invalidateintrinsiccontentsize ,让系统知道在下次布局时重新计算intrinsiccontentsize

// 原有的视图尺寸和现在的不相符,
- (void)layoutsubviews {
 [super layoutsubviews];
 _collectionview.frame = self.bounds;
 if (!cgsizeequaltosize(self.bounds.size, [self intrinsiccontentsize])) {
 [self invalidateintrinsiccontentsize];
 }
}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对移动技术网的支持。

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网