Masonry約束立即生效跟約束更新
原創忝 最后發布於2016-11-14 16:42:07 閱讀數 20941 收藏
展開
在使用Masonry的時候,默認情況下,設置的約束並不會立即生效,此時獲得的所有的frame都為0。但在有的時候,我們需要獲取此時的寬跟高,此時就要設置控件的約束立即生效。
view1 = [UIView new];
[self.view addSubview:view1];
[view1 mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(self.view).insets(UIEdgeInsetsMake(10, 10, 10, 10));
}];
view1.backgroundColor = [UIColor redColor];
NSLog(@"%@",view1.description);
得到的結果顯示frame為0:
<UIView: 0x7f9d20d0b650; frame = (0 0; 0 0); layer = <CALayer: 0x608000227900>>
1
所以需要在mas_makeConstraints之后用它的父視圖調用layoutIfNeeded可以使得約束立即生效:
view1 = [UIView new];
[self.view addSubview:view1];
[view1 mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(self.view).insets(UIEdgeInsetsMake(10, 10, 10, 10));
}];
view1.backgroundColor = [UIColor redColor];
[self.view layoutIfNeeded];
NSLog(@"%@",view1.description);
得到的結果顯示:
<UIView: 0x7fa8d8d05730; frame = (10 10; 394 716); layer = <CALayer: 0x60800003ca20>>
1
提示:layoutIfNeeded在自身也可以生效,不過可能會導致坐標不准確等后果,而用在父視圖上不會發生問題。
關於約束更新:
約束更新內容簡要寫一些,不寫詳細代碼了。
約束更新的內容需要寫入mas_updateConstraints中,如果需要立即更新的話需要兩個步驟1、updateConstraintsIfNeeded 2、layoutIfNeeded
如果需要產生動畫效果的話,將layoutIfNeeded這個方法在[UIView animateWithDuration]中調用即可。
兩個方法都是在父視圖中使用的。
————————————————
版權聲明:本文為CSDN博主「忝」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/u011415099/article/details/53160595