AutoLayout——何为intrinsic content size

上一篇说到了约束就是等式和不等式,仅仅知道其原理还是没法拉出符合需求的线。所以这一篇主要看来什么是intrinsic content size,以及它有什么用。

在Xcode中,几乎所有控件或视图,都有这个属性,在size inspector界面


AutoLayout——何为intrinsic content size_第1张图片
Xcode中的intrinsic content size

开发中用到的一些控件或视图,本身就自带大小,比如UIButton控件,设置完title后就能知道这个UIButton是文字的大小再加上两个固定的button margin。
像这种控件或视图本身就带有的高度、宽度,就叫做intrinsic content size(固定内容尺寸)。

一些经验分享?

一般情况下,我是通过四种操作来设置布局的。

  • 右键拉线。
  • Align面板做对齐操作(position)
  • pin面板做边距或尺寸操作(size)
  • Resolve面板用来更新约束或者更新边框
    后三种就是xib或storyboard界面的右下角的三个小按钮


    三个小按钮

自己拉约束的时候,总会碰到Xcode报红色或黄色的错(如下图),以前怎么拉都没办法拉好约束,乃至于将所有该加的都加上了,但还是没能达到想要的效果,这让人很恼怒。
不过当你懂了一点英语,知道报的错是什么意思,基本就都可以解决了。


AutoLayout——何为intrinsic content size_第2张图片
红色或黄色错误

像下面这种,将鼠标放在Icon上(报错的地方),就会有提示,不得不说Xcode这个IDE已经相当好用了,除了偶尔崩溃受不了。


AutoLayout——何为intrinsic content size_第3张图片
错误的提醒

提示已经说得很明显了,AutoLayout需要Icon的Y轴位置或者高度才能完成对其位置或尺寸的推断,所以咱们通过加Y轴的位置或者高度就可以了。当然具体要加Y轴位置还是高度得看你的需求,不妨都试一试,很容易就能懂的。

固定内容尺寸到底什么用?

一个关于button的例子:
在下图中出现的黄色线,这是什么意思呢?刚开始我也看不明白,Xcode都报warning了。按照提示去修改的话又达不到我想要的效果,因为黄色线是想要我把中间这个按钮的大小调整到黄色框的大小。这明显不符合我的需要。
好吧说说为什么会出现黄色虚线框,这就是固定内容尺寸的原因。我给中间这个MidButton设置的背景图的大小是7575的,而现在MidButton被我缩小到3535,这时候Xcode是根据图片的原大小来推断MidButton的固定内容尺寸的。这时候就坑爹了,运行后的结果如下。似乎唯一的方法只能是调整图片的大小了。

AutoLayout——何为intrinsic content size_第4张图片
黄色线

运行后的效果

妥协的解决办法:设定MidButton的宽和高。

![Uploading Paste_Image_791544.png . . .]
加上宽度和高度的约束后,就可以暂时解决了。不过却没办法根据不同机型的宽度去适配。

所以,看到这里应该就明白固有内容尺寸是什么了。要用AutoLayout的话这个概念非常关键。之前跟着斯坦福视频的老头子做过一阵子的matchismo,一种类似卡牌的游戏,里面有16个按钮,当时用AutoLayout做真是太烦躁了,完全没法做适配,因为只有一种素材,而AutoLayout去渲染后默认出现的是控件或图片的固有内容尺寸,所以当时只能做一种机型的布局。去github逛了一圈也是有这个问题存在。所以用AutoLayout的话,按钮图片的大小非常重要,特别是要适配的时候,一定要配套每种机型的素材。

什么控件有固定内容尺寸?

它就用于辅助系统计算布局。下面看看有哪一些控件或视图是自带固定内容尺寸的。


AutoLayout——何为intrinsic content size_第5张图片
控件或视图
  • UIView和NSView(OSX)没有固定内容尺寸
  • Sliders 在iOS中只定义了宽度,而在OSX中则有可能是宽度、高度或两者
  • Labels ,buttons,switches,text fields,都有高度和宽度
  • Text views 和image views 固定内容宽度可变

总结

如果你有很多有背景图片的按钮需要布局的话,autolayout慎用,不然当你调不出想要的效果又不知道原因在哪的时候回特别抓狂。总之你要随便调整控件或视图的内容,不按照固有内容尺寸的话,是不大可能的了。苹果这么去规定也是有其道理的,毕竟人家都给出了UI的设计规范了嘛,按照规范来,通过审核也容易。

你可能感兴趣的:(AutoLayout——何为intrinsic content size)