intrinsic content size
- UIView&NSView:无
- Slider:只能定义width(ios);依赖slider类型定义width,height或两者(os x)
- Label,Button,Switch,Text Field:定义width和height
- Text View,Image View:intrinsic content size可变
- Label,Button:依赖文本显示数量和字体使用
- Image View:view无image,无intrinsic content size,view含image,intrinsic content size同image size
- Text View:依赖内容&滚动条是否可用&view constraint,滚动条可用,无intrinsic content size,滚动条禁用,默认intrinsic content size不换行(单行)的文本size,如果view width约束,intrinsic content size定义为指定width情况下显示文本所需height
intrinsic content size constraint
- content hugging:压缩view的width和height,使view size尽可能贴紧view content
- compression resistance:拉伸view的width和height,阻止因为view size太小而导致裁剪view content
intrinsic content size constraint用不等constraint表示
// Compression Resistance
View.height >= 0.0 * NotAnAttribute + IntrinsicHeight
View.width >= 0.0 * NotAnAttribute + IntrinsicWidth
// Content Hugging
View.height <= 0.0 * NotAnAttribute + IntrinsicHeight
View.width <= 0.0 * NotAnAttribute + IntrinsicWidth
每条constraint有自己优先级,默认content hugging优先级为250,compression resistance优先级为750,因此拉伸view比压缩view更容易,有时IB偶尔会改变默认优先级值(提高layout效率),但代码层从不会这么做
CHCR
CHCR,即content-hugging and compression-resistance,在auto layout中尽可能使用intrinsic content size以动态适配view content change,且可减少layout solution的constraint数量,但这需管理好CHCR优先级,处理intrinsic content size有以下原则:
当需要拉伸一系列view以填充额外空间,如果所有view拥有相同content-hugging优先级,auto layout二义性,auto layout不知道哪个view被拉伸,比如常见的一个label和text field,需求是text field拉伸填充额外空间,label保持intrinsic content size不变,可让text field horizontal content-hugging优先级低于label,事实上,这种情况非常常见,IB自动处理了这个问题,label的content-hugging优先级被设置为251,但如果代码创建layout,需要开发者自己修改content-hugging priority
当view无可见背景(比如button和label)偶尔拉伸超过它们intrinsic content size,奇怪和意外的layout经常发生,文本显示在错误位置,为避免这种拉伸,增加content-hugging优先级