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優先級




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