在復(fù)雜的系統(tǒng)中拴驮,難免遇到混合使用frame和contrains的情況楞陷。這里記錄下我遇到的一種情況韵洋。
RootView:使用frame方式。
ContentView: RootView的子view棺榔,采用Masonry約束瓶堕。
CGRect rect = self.RootView.frame;
[UIView animateWithDuration:0.3 animations:^{
weakSelf.RootView.frame = CGRectMake(rect.origin.x, rect.origin.y - 50, rect.size.width, rect.size.height + 50);
}];
想要實(shí)現(xiàn)的是,調(diào)整RootView的y症歇,并同時(shí)增加高度郎笆;但是實(shí)際效果是ContentView動(dòng)畫效果總是跟RootView不一致。
修改方案:
CGRect rect = self.RootView.frame;
[UIView animateWithDuration:0.3 animations:^{
weakSelf.RootView.frame = CGRectMake(rect.origin.x, rect.origin.y - 50, rect.size.width, rect.size.height + 50);
[weakSelf.RootView layoutIfNeeded];
}];
增加layoutIfNeeded方法調(diào)用忘晤,API中的解釋是:
Allows you to perform layout before the drawing cycle happens. -layoutIfNeeded forces layout early
使用此方法強(qiáng)制立即進(jìn)行l(wèi)ayout,從當(dāng)前view開始宛蚓,此方法會(huì)遍歷整個(gè)view層次(包括superviews)請(qǐng)求layout。因此设塔,調(diào)用此方法會(huì)強(qiáng)制整個(gè)view層次布局凄吏。
猜測(cè)是刷新約束需要調(diào)用layout。