iOS 當Animation遇到Constrains

weixin_34082695發表於2016-06-01
97652-343dbdfcba8ac4b4.png
UI層級關係

在複雜的系統中,難免遇到混合使用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);
}];

想要實現的是,調整RootView的y,並同時增加高度;但是實際效果是ContentView動畫效果總是跟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方法呼叫,API中的解釋是:
Allows you to perform layout before the drawing cycle happens. -layoutIfNeeded forces layout early

使用此方法強制立即進行layout,從當前view開始,此方法會遍歷整個view層次(包括superviews)請求layout。因此,呼叫此方法會強制整個view層次佈局。

猜測是重新整理約束需要呼叫layout。

相關文章