iOS使用Masonry在模擬器里約束不起作用


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)行立即更新。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類(lèi)型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,136評(píng)論 1 32
  • 面向?qū)ο蟮娜筇匦裕悍庋b、繼承、多態(tài) OC內(nèi)存管理 _strong 引用計(jì)數(shù)器來(lái)控制對(duì)象的生命周期。 _weak...
    運(yùn)氣不夠技術(shù)湊閱讀 1,129評(píng)論 0 10
  • 布局 layoutSubviews 不能顯示調(diào)用這個(gè)方法,有許多可以在run loop 的不同時(shí)間點(diǎn)觸發(fā)layou...
    _YZG_閱讀 4,527評(píng)論 0 2
  • d3.zoom() Creates a new zoom behavior. The returned behav...
    鄒小鄒大廚閱讀 880評(píng)論 0 0
  • 青蔥歲月,在荷爾蒙的刺激下,少男,少女變的沖動(dòng)和暴躁。臉上的小痘痘如雨后竹筍般,陸陸續(xù)續(xù)長(zhǎng)滿了整張臉龐,這讓看重美...
    愛(ài)笑的阿斗閱讀 141評(píng)論 0 0