UIView 小結

1 生命週期

  1. UIView沒有designated初始化方法。
  2. 初始化

3. 生命週期

updateConstraintslayoutSubviews的關係有點像,收集-實施的關係。(準備數據、使用數據)bash

觸發layoutSubviews的方式:佈局

  1. setFrame,且frame不是CGRectZero,(且先後變化)
  2. addSubview:,removeSubview:
  3. 滾動UIScrollView
  4. 屏幕旋轉
  5. setNeedsLayout,setNeedUpdateConstraints(且先後變化)
  6. 改變frame,只觸發本身的layoutSubviews,不會影響到父視圖、兄弟視圖

2 代碼組織

  1. initialize中 座標計算,使用static變量只計算一次ui

  2. initWithFrame:中spa

    組裝subviewcode

  3. setModel中cdn

    配置數據源,needLayoutblog

  4. layoutSubviews中繼承

    處理佈局生命週期

注意有些第三方庫的view,可能沒有實現layoutSubviews,而是重寫了setFrame:,若是咱們的View以他們爲subview了, 要注意:事件

3 注意事項

3.1 繪製順序

深度優先: 父視圖,有兄弟視圖的狀況下,先繪製父視圖,而後繪製父視圖的子視圖,最後繪製兄弟視圖。

4 經常使用API

4.1 獲取controller

//比superview準確,用superview的話,要判斷navigationController和tabbarController
- (UIViewController *)viewController {
    UIResponder *responder = self;
    while (![responder isKindOfClass:[UIViewController class]]) {
        responder = [responder nextResponder];
        if (nil == responder) {
            break;
        }
    }
    return (UIViewController *)responder;
}
複製代碼

4.2 一些屬性

4.2.1 透明度相關

//1. alpha,hidden。較少用,opaque。
//2. opacity,layer的屬性,至關於view.alpha,但設置爲0,也不影響事件響應。
複製代碼

以上都會影響子視圖(或子layer),若是但願父視圖透明,子視圖不透明。

//只對顏色有效,對圖片無效
superView.backgroundColor = [[UIColor lightGrayColor] colorWithAlphaComponent:0.5];
複製代碼

4.2.2 切邊相關

//效果上沒區別
view.clipsToBounds = YES;
layer.masksToBounds = YES;
複製代碼

4.2.3 其餘

//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
複製代碼

5 其餘

5.1 frame和bounds

  • 修改view's bounds.size,center不會變。origin會變。
  • 修改bounds.origin,這個view不會變,變的是他的subviews。由於至關於改了子視圖frame所處的座標系。UIScrollView用到了。
相關文章
相關標籤/搜索