調(diào)試有歧義的布局
1. 使用hasAmbiguousLayout來測試約束是否充分
如果約束充分廊勃,則返回NO缀匕,如果某個視圖可能顯示另一種不同的框架,則返回YES
2. 視圖內(nèi)容的大小通過每個視圖的 intrinsicContentSize屬性表達
UIImageView *iv = [[UIImageView alloc] initWithImage:[UIImage imageWithName:@"icon.png"]];
NSLog(@"%@", NSStringFromCGSize(iv.intrinsicContentSize));
結(jié)果輸出的大小與圖片icon大小相同
無歧義的布局通常需要給每個坐標軸設置兩個屬性芜茵。當時圖有一個內(nèi)在內(nèi)容大小時像樊,則只需要設置兩個屬性中的一個。例如予颤,可以把基于文本的控件或者圖像視圖放在其父視圖的中心囤官,它的布局將是無歧義的布局。內(nèi)在內(nèi)容大小和視圖位置共同構(gòu)成了充分制定的布局蛤虐。
當改變了視圖的內(nèi)在內(nèi)容時党饮,需要調(diào)用==invalidateIntrinsicContentSize==方法,讓AutoLayout知道在下次布局時重新計算驳庭。
3. 如果知道對齊矩形和整個圖像的邊界刑顺,可以自動計算需要傳遞給該方法的邊緣inset
UIEdgeInsets BuildInsets(CGRect alignmentRect , CGRect imageBounds){
//Ensure alignment rect is fully within source,CGRectIntersection用來計算兩個矩形的相交區(qū)域
CGRect targetRect = CGRectIntersection(alignmentRect,imageBounds);
//Calculate insets
UIEdgeInsets insets;
insets.left = CGRectGetMinX(targetRect) - CGRectGetMinX(imageBounds);
insets.right = CGRectGetMaxX(imageBounds) - CGRectGetMaxX(targetRect);
insets.top = CGRectGetMinY(targetRect) - CGRectGetMinY(imageBounds);
insets.bottom = CGRectGetMaxY(imageBounds) - CGRectGetMaxY(targetRect);
return insets;
}
4. translatesAutoresizingMaskIntoConstraints = NO;
當整個代碼段將translatesAutoresizingMaskIntoConstraints設置為NO時,該默認的初始值實質(zhì)上已被棄用(例如前面設置了初始的frame大兴浅!)蹲堂,可能導致寬度為0
最后編輯于 :
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者