有時候我們會遇到這樣的問題:假如在(xib或者sb就統稱nib)nib中有一個view(默認大小是100*100),我在控制器中的viewDidLoad方法中更改了frame卻發現打印出的值確實是改了,但是實際上顯示的結果卻沒有變化?如下所示:
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"before----%@",NSStringFromCGRect(self.myView.frame));
CGRect tempFrame = self.myView.frame;
tempFrame.size.width += 100;
self.myView.frame = tempFrame;
NSLog(@"after----%@",NSStringFromCGRect(self.myView.frame));
}
打印結果,寬度確實是變了:
模擬器上顯示的結果沒有變化,依然是100*100:
為什么會出現這種情況呢?
罪魁禍首就在在于這里:
如果我們是從nib中通過拖線連接的屬性,那么在viewDidLoad之后會根據初始的frame再計算一次frame,過程中,你雖然更改了frame,但是auto layout之后又恢復了之前的frame,所以模擬器顯示沒有變化.
但為什么打印值變了呢?很簡單,因為auto layout是在viewDidLoad方法之后計算的,所以在viewDidLoad方法中打印出的值肯定改變了,可后面又被改變回原來的值.
這里有一個注意點:在viewDidLoad方法中打印的frame可能不準確.
那怎么才能真正的去更改frame呢?
有兩種方式:
- 在viewDidLayoutSubviews方法中改變frame,這個方法通常是view顯示之前最后執行的,所以這里更改沒問題
- (void)viewDidLayoutSubviews{
[super viewDidLayoutSubviews];
CGRect tempFrame = self.myView.frame;
tempFrame.size.width += 100;
self.myView.frame = tempFrame;
NSLog(@"2----%@",NSStringFromCGRect(self.myView.frame));
}
打印結果:
模擬器顯示:
2.第二種方式更簡單,去掉auto layout,就可以在viewDidLoad方法中更改了
結果一樣,就不再贅述了.
謝謝!如有不正確的地方,歡迎指正.