iOS佈局渲染-UIView方法調用時機
一、約束
- (void)updateConstraints NS_AVAILABLE_IOS(6_0) NS_REQUIRES_SUPER;
何時觸發如下所示:
-
initWithFrame時候調用,但是要求重寫以下方法,並返回YES。
+ (BOOL)requiresConstraintBasedLayout NS_AVAILABLE_IOS(6_0);
-
標記爲需要更新,下次drawing cycle自動調用。當約束改變時,下次render loop還會自動調用layoutSubviews(佈局)
- (void)setNeedsUpdateConstraints NS_AVAILABLE_IOS(6_0);
-
如果有需要更新的標記,立即調用。當約束改變時,下次render loop還會自動調用layoutSubviews(佈局)
- (void)updateConstraintsIfNeeded NS_AVAILABLE_IOS(6_0);
二、佈局
- (void)layoutSubviews;
何時觸發如下所示:
-
initWithFrame時候調用,但是rect的值不能爲CGRectZero。
- (instancetype)initWithFrame:(CGRect)frame NS_DESIGNATED_INITIALIZER;
-
標記爲需要佈局,下次drawing cycle自動調用。
- (void)setNeedsLayout;
-
如果有需要佈局的標記,立即調用。
- (void)layoutIfNeeded;
-
自己的frame發生改變時,約束也會導致frame改變。
@property(nonatomic) CGRect frame;
添加子視圖或者子視圖frame改變時,約束也會導致frame改變。
- 視圖被添加到UIScrollView,滾動UIScrollView。
三、顯示
- (void)drawRect:(CGRect)rect;
何時觸發如下所示:
-
initWithFrame時候調用,但是rect的值不能爲CGRectZero。
- (instancetype)initWithFrame:(CGRect)frame NS_DESIGNATED_INITIALIZER;
-
標記爲需要顯示,下次drawing cycle自動調用。
- (void)setNeedsDisplay;