有時(shí)候我們?cè)陂_發(fā)或者是看其他人編寫的組件的時(shí)候 經(jīng)常會(huì)看到子類重寫了layoutSubviews的方法子類調(diào)用了有時(shí)候又會(huì)調(diào)用setNeedsLayout和layoutIfNeeded那么有時(shí)候偶爾會(huì)想為什么需要調(diào)用setNeedsLayout和layoutIfNeeded 這兩個(gè)方法和layoutSubviews之間又有什么聯(lián)系呢?
layoutSubview的作用是什么呢?
-
layoutSubview的字面意思就是布局子控件。 - 需要首先需要明確的一點(diǎn)是系統(tǒng)的View并不會(huì)在
layoutSubview方面里面實(shí)現(xiàn)某些代碼,如果想要在layoutSubview搞事情,必須要子類去重寫該方法 - 當(dāng)需要更新
subview的frame的時(shí)候
layoutSubview何時(shí)觸發(fā)呢?
- 子視圖首次被添加到父視圖,子視圖會(huì)觸發(fā)
layoutSubviews - 視圖改變自身的size的時(shí)候,會(huì)觸發(fā)
layoutSubviews - 當(dāng)視圖添加subview的時(shí)候
- 第一次滑動(dòng)UIScrollView的時(shí)候觸發(fā)
layoutSubviews。 - 旋轉(zhuǎn)Screen會(huì)觸發(fā)父UIView上的layoutSubviews事件。
- 手動(dòng)調(diào)用
setNeedsLayout - init的時(shí)候不會(huì)觸發(fā)
layoutSubviews
其他
-
注意
image.png - 有時(shí)候需要?jiǎng)赢嬓Ч麃硭⑿陆缑?分為通過frame或者是autolayout,如果是frame方式創(chuàng)建view并且 那么我們直接調(diào)用既可
[UIView animateWithDuration:5 animations:^{
self.testView.frame=CGRectMake(0, 0, 10, 111);
} completion:^(BOOL finished) {
}];
- 如果是通過autolayout布局,需要把約束寫在
animateWithDuration的前面,那樣子才會(huì)執(zhí)行動(dòng)畫效果。具體為什么,還不是很清楚
self.animationViewWIdth.constant=200;
self.animationViewWIdth.constant=100;
[UIView animateWithDuration:5 animations:^{
[self.animationView setNeedsLayout];
[self.animationView layoutIfNeeded];
} completion:^(BOOL finished) {
}];
