您的位置:首页 > 其它

AutoLayout小技巧系列(二)

2016-01-19 17:06 411 查看
转载 http://www.jianshu.com/p/248c5ed719ec

AutoLayout小技巧系列(二)



要求

label1和label2等宽多行

label3的位置 由label1和label2的内容决定(谁行高就贴着他的底部)

label1和label2不能被拉大,位置居上显示

那么高潮来了,他给出了他的做法:通过俗套的计算label高度的方式,强行给label3设置约束

我呵呵一笑,既然autoLayout这么方便,那么为啥还要回到frame时代那种又丑又不好用的方式

我的思路

在label3顶部分别给label1 和label2底部拉一根约束,通过判断label1和label2内容高度决定这两个约束的优先级,来决定在哪个label的下方,可能说起来比较抽象,那么上图

建立这两个约束,分别是label3和label1垂直方向,label3和label2垂直方向的约束(姑且设为0)



2.把这两个约束优先级都设为750(低于1000就行),为啥要低于1000,可以看我之前的AutoLayout小技巧系列(一)



3.判断这label1和label2的内容大小,我这里采取简单粗暴的直接比较字符串长度,然后决定上面两个约束的优先级

[code]BOOL label1LonerThanLabel2 = label1.text.length> label2.text.length;
lcToLabel1.priority = label1LonerThanLabel2?UILayoutPriorityDefaultHigh:UILayoutPriorityDefaultLow;
lcToLabel2.priority = label1LonerThanLabel2?UILayoutPriorityDefaultLow:UILayoutPriorityDefaultHigh;


按理来说,到这里就结束了,但是如图,没有满足上述需求的第三点,另一个label被拉大了,居中显示变得很难看!!!!




仔细研究了一下,发现label本身的Hugging (这个属性可以理解为frame由内容决定,阻止被外部因素拉大)的Priority就是UILayoutPriorityDefaultLow,那么跟上述低优先级一致,然后系统判断就被拉大了

方案

只要将label本身的Hugging Priority 设置的高一些或者 代码直接改成如下就ok了

[code]BOOL label1LonerThanLabel2 = label1.text.length> label2.text.length;
lcToLabel1.priority = label1LonerThanLabel2?UILayoutPriorityDefaultHigh:UILayoutPriorityFittingSizeLevel;
lcToLabel2.priority = label1LonerThanLabel2?UILayoutPriorityFittingSizeLevel:UILayoutPriorityDefaultHigh;


完美!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: