Masonry,一款制造UI布局的利器,相信不少iOS開(kāi)發(fā)者都了解或使用過(guò)。然而筆者在使用過(guò)程中偶然發(fā)現(xiàn),在模擬器里部分視圖的約束不起作用甚至數(shù)值出錯(cuò)導(dǎo)致布局錯(cuò)亂,而在真機(jī)里卻能正常顯示。
后來(lái)查了一手資料,找到了解決方法,如下:
[self.view layoutIfNeeded];
給視圖設(shè)定完約束后加上如上一行代碼即可。
完整示例如下:
[self.view addSubview:self.timeLabel];
[self setNeedsUpdateConstraints];
[self.timeLabel mas_makeConstraints:^(MASConstraintMaker *make) {
...
}];
[self updateConstraints]; // 重寫(xiě)updateConstraints函數(shù)就用super
[self.view layoutIfNeeded];
這里要注意下,是要調(diào)用父視圖的layoutIfNeeded。調(diào)用子視圖有時(shí)也可以,但會(huì)出現(xiàn)數(shù)值偏差的情況。
自己的結(jié)論:layoutIfNeeded可以讓視圖的約束立刻生效。由于模擬器的性能較低,約束還未生效就顯示了視圖才導(dǎo)致現(xiàn)象的產(chǎn)生。而真機(jī)性能較高,能較快的使約束生效。(純屬推測(cè)的,哈哈...)
搬來(lái)的結(jié)論:
1、如果要立即刷新,要先調(diào)用[view setNeedsLayout],把標(biāo)記設(shè)為需要布局,然后馬上調(diào)用[view layoutIfNeeded],實(shí)現(xiàn)布局。
2、在視圖第一次顯示之前,標(biāo)記肯定是“需要刷新”的,所以直接調(diào)用[view layoutIfNeeded]就會(huì)進(jìn)行立即更新。