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