服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - IOS - iOS中的AutoLayout使用实践总结

iOS中的AutoLayout使用实践总结

2021-04-08 17:24Zev003 IOS

在对界面进行布局的时候,我们经常使用AutoLayout对界面进行布局适配。下面这篇文章主要给大家介绍了iOS中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生效

?
1
2
3
4
5
6
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

?
1
2
3
4
5
6
7
8
// 原有的视图尺寸和现在的不相符,
- (void)layoutSubviews {
 [super layoutSubviews];
 _collectionView.frame = self.bounds;
 if (!CGSizeEqualToSize(self.bounds.size, [self intrinsicContentSize])) {
 [self invalidateIntrinsicContentSize];
 }
}

总结

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

原文链接:http://www.jianshu.com/p/1021ff70ee2d

延伸 · 阅读

精彩推荐
  • IOSiOS布局渲染之UIView方法的调用时机详解

    iOS布局渲染之UIView方法的调用时机详解

    在你刚开始开发 iOS 应用时,最难避免或者是调试的就是和布局相关的问题,下面这篇文章主要给大家介绍了关于iOS布局渲染之UIView方法调用时机的相关资料...

    windtersharp7642021-05-04
  • IOSiOS通过逆向理解Block的内存模型

    iOS通过逆向理解Block的内存模型

    自从对 iOS 的逆向初窥门径后,我也经常通过它来分析一些比较大的应用,参考一下这些应用中某些功能的实现。这个探索的过程乐趣多多,不仅能满足自...

    Swiftyper12832021-03-03
  • IOSiOS中tableview 两级cell的展开与收回的示例代码

    iOS中tableview 两级cell的展开与收回的示例代码

    本篇文章主要介绍了iOS中tableview 两级cell的展开与收回的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    J_Kang3862021-04-22
  • IOS关于iOS自适应cell行高的那些事儿

    关于iOS自适应cell行高的那些事儿

    这篇文章主要给大家介绍了关于iOS自适应cell行高的那些事儿,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的...

    daisy6092021-05-17
  • IOSIOS 屏幕适配方案实现缩放window的示例代码

    IOS 屏幕适配方案实现缩放window的示例代码

    这篇文章主要介绍了IOS 屏幕适配方案实现缩放window的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要...

    xiari5772021-06-01
  • IOS解析iOS开发中的FirstResponder第一响应对象

    解析iOS开发中的FirstResponder第一响应对象

    这篇文章主要介绍了解析iOS开发中的FirstResponder第一响应对象,包括View的FirstResponder的释放问题,需要的朋友可以参考下...

    一片枫叶4662020-12-25
  • IOSIOS开发之字典转字符串的实例详解

    IOS开发之字典转字符串的实例详解

    这篇文章主要介绍了IOS开发之字典转字符串的实例详解的相关资料,希望通过本文能帮助到大家,让大家掌握这样的方法,需要的朋友可以参考下...

    苦练内功5832021-04-01
  • IOSiOS 雷达效果实例详解

    iOS 雷达效果实例详解

    这篇文章主要介绍了iOS 雷达效果实例详解的相关资料,需要的朋友可以参考下...

    SimpleWorld11022021-01-28