uikit——Auto Layout——intrinsic content size

intrinsic content size

intrinsic content size,即固有内容尺寸,表示view当前内容size,并非所有view拥有intrinsic content size,对于拥有intrinsic content size的view,intrinsic content size可定义view 的width,height或两者,通用控件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可变
intrinsic content size依赖view当前内容,而view当前内容在不同view中含义不同,因此intrinsic content size在不同view中含义也不同:
  • 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

intrinsic content size由每个方向上(x-axis或y-axis)一组constraint表示,intrinsic content size分两类:
  • 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优先级




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章