updateConstraints
和layoutSubviews
的關係有點像,收集-實施的關係。(準備數據、使用數據)bash
觸發layoutSubviews的方式:佈局
initialize中 座標計算,使用static變量只計算一次ui
initWithFrame:中spa
組裝subviewcode
setModel中cdn
配置數據源,needLayoutblog
layoutSubviews中繼承
處理佈局生命週期
注意有些第三方庫的view,可能沒有實現layoutSubviews,而是重寫了setFrame:,若是咱們的View以他們爲subview了, 要注意:事件
深度優先: 父視圖,有兄弟視圖的狀況下,先繪製父視圖,而後繪製父視圖的子視圖,最後繪製兄弟視圖。
//比superview準確,用superview的話,要判斷navigationController和tabbarController
- (UIViewController *)viewController {
UIResponder *responder = self;
while (![responder isKindOfClass:[UIViewController class]]) {
responder = [responder nextResponder];
if (nil == responder) {
break;
}
}
return (UIViewController *)responder;
}
複製代碼
//1. alpha,hidden。較少用,opaque。
//2. opacity,layer的屬性,至關於view.alpha,但設置爲0,也不影響事件響應。
複製代碼
以上都會影響子視圖(或子layer),若是但願父視圖透明,子視圖不透明。
//只對顏色有效,對圖片無效
superView.backgroundColor = [[UIColor lightGrayColor] colorWithAlphaComponent:0.5];
複製代碼
//效果上沒區別
view.clipsToBounds = YES;
layer.masksToBounds = YES;
複製代碼
//1. sizeToFit,在autoLayout中無效了,要強行生效,能夠寫在viewDidLayoutSubviews中
//2. tintColor,默認背景色,會被子類繼承
//3. multipleTouchEnabled,是否開啓多點觸摸,默認NO
//4. exclusiveTouch,事件獨佔,默認NO
表示事件獨佔,若是UIView是事件的firstResponder,那麼第一個手指離開前,其餘視圖不會響應任何觸摸事件。(僅Touch事件,不包括手勢)
iOS 解決頁面按鈕同時點擊,同時觸發問題 設置全部UIButton的ExclusiveTouch屬性爲YES
-(void)setExclusiveTouchForButtons:(UIView *)myView {
for (UIView * v in [myView subviews]) {
if([v isKindOfClass:[UIButton class]])
[((UIButton *)v) setExclusiveTouch:YES];
else if ([v isKindOfClass:[UIView class]]){
[self setExclusiveTouchForButtons:v];
}
}
}
//5. 根據tag拿view
viewWithTag:
//6. 是否爲子視圖
isDescendantOfView:
//7.層級、響應相關
insertSubview:belowSubview:
insertSubview:aboveSubview:
becomeFirstResponder
resignFirstResponder
bringSubviewToFront:
sendSubviewToBack:
//8. sizeToFit,會被autoLayout覆蓋(除非在viewDidLayoutSubviews中調用,不推薦),不須要太在乎這個屬性
sizeToFit //不要重寫,可能會改變原始frame
siztThatFits //重寫這個,爲sizeToFit提供數據,"照這個數據fit"
//9. 刷新相關
setNeedsUpdateConstraints
updateConstraintsIfNeeded
setNeedsLayout
layoutIfNeeded
setNeedsDisplay
複製代碼