美文网首页
Autolayout UIView 和UILabel 的区别

Autolayout UIView 和UILabel 的区别

作者: CheATSlark | 来源:发表于2018-04-17 18:15 被阅读0次

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

    图1   

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

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

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

    图2

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

    图3

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

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

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

    图4

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

    图5 图6

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

    图7

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

    图8

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

    相关文章

      网友评论

          本文标题:Autolayout UIView 和UILabel 的区别

          本文链接:https://www.haomeiwen.com/subject/gcrpkftx.html