Autolayout UIView 和UILabel 的区别

        所知,UILabel继承自UIView 满足NSCoding,UIContentSizeCategroyAdjusting两个协议。那么在Autolayout的世界中,是否可以作为一视同仁呢?从中有能揭开多少autolayout的面纱呢?


Autolayout UIView 和UILabel 的区别_第1张图片
图1   

        形如图1,考虑这样一个问题:一个UIView 居中放置在一个控制器的View上,其大小是由它的两个子视图的大小决定的。如果两个子视图的size已知,那么可以十分轻易的确定UIView的小大。

        再者开来,两个子视图 可能是UIView 也可以是UILabel。当对于一个UILabel 来说,我们可以不用控制其长度,因为它可以由自己的ContenSize来决定宽高。

        试想,现在有一个需求,动态的出现和消失第一个子视图,这个时候,如果用AutoLayout来解决问题,就要对第二个子视图,添加一个低等级的约束。

Autolayout UIView 和UILabel 的区别_第2张图片
图2

        如图2,对第二个子视图添加一个低等级800对父视图左边的为0的约束。十分轻松的添加上了。这个时对UILabel 进行同样的操作,则出现了图3的情况

Autolayout UIView 和UILabel 的区别_第3张图片
图3

        WTF?明明第一个UILabel,已经确定了contensize,为什么contensize的宽变成0,UILabel是有内容的啊。难道是storyboard的问题,运行一下项目,无事发生。到底是什么原因呢?这里被绊住了好一阵。

        结果是很简单:你需要调节一下UILabel约束的等级,设置成700时,就会发现能按愿望完美展示了。具体的原因,猜想,应该是UILabel的contensize的约束的等级的临界值在700附近,当约束大于800会使得contensize的约束失效。即使UILabel内部有text也起不到作用。

        上篇说了,autolayout是可以在运行的时候进行调试的,下面就附上一个例子。


Autolayout UIView 和UILabel 的区别_第4张图片
图4

        图4,可以看出右边的UILabel,并没有完全的展开。具体什么原因,我们可以,打开Xcode自带视图调控。获取相应的图层结构。


Autolayout UIView 和UILabel 的区别_第5张图片
图5


Autolayout UIView 和UILabel 的区别_第6张图片
图6

图5,为左边正常展开的UILabel的约束。图6,为右边不正常展开的UILabel的约束。可以看到第二个self.width 变灰,证明其已经失效了。如果一时间看不出来头绪,我们可以查看一下父视图的约束,如图7.


Autolayout UIView 和UILabel 的区别_第7张图片
图7

大致看一下,你会发现 self.trailing = label.trailing +40@1000。特别的扎眼。它让self.trailing = label.trailing@1000。失效了。回到原来的nib文件。


Autolayout UIView 和UILabel 的区别_第8张图片
图8

确实,在毫无感觉的情况下,我们添加了一个对allFordLabel的40的约束。删掉这个约束。文件没有正常,重新运行项目,视图已经恢复正常了。

你可能感兴趣的:(Autolayout UIView 和UILabel 的区别)