目录:[TOC]
介绍
Auto Layout前身是Cassowary,本质上是通过联立线性方程组来描述界面元素之间的位置关系,他的厉害之处在于为界面元素建立关系。
本文主要介绍Auto Layout对于界面元素中的内容大小的处理,诸如UILabel
或者UIImageView
,日常开发中经常要根据内容的多少来拉伸缩放控件的大小,不论是UIIamgeView
的Image或者UILabel
中的Text。
通用
视图内容的大小可以通过调用视图的intrinsicContentSize
(iOS 6.0 后可用)来获取,他是隶属于UIView
的实例方法。
UILabel *label = [[UILabel alloc] initWithFrame:CGRectZero];
label.text = @"来自lintingmuse的CSDN博客";
NSLog(@"%@", NSStringFromCGSize(label.intrinsicContentSize));
你可以通过该方法来获得UIButton
、UILabel
、UIImageView
的内容未经压缩或裁减的情况下填充内容所需的最小空间。但是他并不能获得UIView
的子视图的内容大小。当对没有数据内容的UIView
的实例调用intrinsicContentSize
时,它将返回UIViewNoIntrinsicMetric
。当改变了视图的内在内容时,需要调用invalidateIntrinsicContentSize
方法,这样才能让Auto Layout下次布局时重新计算大小。
压缩阻力和内容吸附
压缩阻力指的是保护内容不被裁减或压缩的一种方式。压缩阻力优先级高的视图能够保护内容不被裁减或压缩。
图a
图b
图a和图b对比展示了压缩阻力优先级高低对于视图内容展示的影响。图a能完整展示内容,而图b的文字内容被省略。
设置压缩阻力优先级可以通过在IB中设置:
此处设置的是水平方向的高压缩阻力优先级
也可以通过代码来设置:
[label setContentCompressionResistancePriority:1000 forAxis:UILayoutConstraintAxisHorizontal];
默认情况下的压缩阻力优先级为750,而默认情况下高度和宽度等的约束优先级为1000。而通过调整高度或宽度的约束优先级与压缩阻力的优先级相配合,也就能完美地解决内容大小动态变化时带来的问题。
转载请标明本文链接!