源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

iOS中的AutoLayout使用实践总结

  • 时间:2020-02-23 12:09 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:iOS中的AutoLayout使用实践总结
[b]前言[/b] AutoLayout非常强大也非常易用,可读性也很强,加上各种第三方AutoLayout库,让你布起局来犹如绷掉链子的狗!但在使用中也有各种各样的问题,下面就来给大家详细介绍下。 [b]AutoLayout 问题[/b] [list] [*]布局冲突[/*] [*]固有尺寸冲突[/*] [*]布局和固有尺寸冲突[/*] [/list] [b]主要概念[/b] [list] [*]固有尺寸 intrinsicContentSize(意思就是说我知道自己的大小,如果你没有为我指定大小,我就按照这个大小来。)[/*] [*]hugging,compress[/*] [*]priority[/*] [*]constraint:equal,unequal[/*] [/list] 一个UIView显示,需要有2个元素,position & size。AutoLayout可以确定view 的这两个,so 不用frame。 [b]1、布局遇到的问题[/b] 布局绝对冲突: eg 设置了 view 的左右,然后又有个 width,造成冲突    解决方案:     1.设置优先级(低优先级constraint没有用到的时候的时候系统默认忽略)     2.删除没有的constraint(常用) [b]2、布局模糊冲突[/b]     假设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 [list] [*]Hugging (不想填充空间)[/*] [*]Compression (不想被挤压)[/*] [*]有这两个特性的 view 一定实现了 intrinsicContentSize[/*] [*]Hugging 默认 priority = 250[/*] [*]Compression 默认 priority = 750[/*] [*]其他 constraint 默认 priority = 1000(最大)[/*] [/list] 当 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];
 }
}
[b]总结[/b] 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对编程素材网的支持。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部