iOS_Masory布局踩坑

一、源起

最近在使用Masory做動態(tài)布局的時候叉信,發(fā)現(xiàn)一個問題什乙。
首先列舉下我的當(dāng)時的做法液肌。

做法一。
在Cell的復(fù)用方法里添加子控件

-(instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    if (self =[super initWithStyle:style reuseIdentifier:reuseIdentifier]) {

        [self.contentView addSubview:self.oneLabel];
        [self.contentView addSubview:self.TwoImageView];
    }
    return  self;
}

在layoutSubviews方法里面進(jìn)行約束設(shè)置 當(dāng)然懶加載的代碼就不多寫了
這里的需求是前面一個label 后面一個imageView 同行顯示。imageView的X需要由label內(nèi)容來確定。

-(void)layoutSubviews {
  [super ayoutSubviews];
//這里設(shè)置約束代碼
[self.oneLabel mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.equalTo(self.contentView).offset(16);
        make.top.equalTo(self.contentView).offset(20);
        make.height.mas_equalTo(24);
    }];
    
    [self.TwoImageView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.equalTo(self.oneLabel).offset(4);;
        make.width..mas_equalTo(56);
       make.height.mas_equalTo(17);
       make.center.equalTo(self.oneLabel);
    }];
}

給cell賦值model 并重新設(shè)置約束

-(void)setModel:(Model*)model {
  self.oneLabel.text = @"這里做一個測試數(shù)據(jù)的展示";  
  //這里設(shè)置約束代碼
//更新約束
[self.oneLabel update_makeConstraints:^(MASConstraintMaker *make) {
        make.left.equalTo(self.contentView).offset(16);
        make.top.equalTo(self.contentView).offset(20);
        make.height.mas_equalTo(24);
    }];
    
    [self.TwoImageView update_makeConstraints:^(MASConstraintMaker *make) {
        make.left.equalTo(self.oneLabel).offset(4);;
        make.width..mas_equalTo(56);
       make.height.mas_equalTo(17);
       make.center.equalTo(self.oneLabel);
    }];
}

以上方式出來之后 發(fā)現(xiàn)oneLabel不顯示豹悬。TwoImageView顯示錯位了。

嘗試修改一:

[self.oneLabel re_makeConstraints:^(MASConstraintMaker *make) {
        make.left.equalTo(self.contentView).offset(16);
        make.top.equalTo(self.contentView).offset(20);
        make.height.mas_equalTo(24);
    }];
    
    [self.TwoImageView re_makeConstraints:^(MASConstraintMaker *make) {
        make.left.equalTo(self.oneLabel.mas_right).offset(4);;
        make.width..mas_equalTo(56);
       make.height.mas_equalTo(17);
       make.center.equalTo(self.oneLabel);
    }]液荸;
}

仍舊無效屿衅,并且控制臺不斷輸出約束報錯信息。

嘗試修改二:

-(void)layoutSubviews {
  [super ayoutSubviews];
//這里設(shè)置約束代碼
[self.oneLabel mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.equalTo(self.contentView).offset(16);
        make.top.equalTo(self.contentView).offset(20);
        make.height.mas_equalTo(24);
    }];
   /去掉設(shè)置imageView的約束 等到拿到數(shù)據(jù)后在重新設(shè)置莹弊。
}

仍然無效涤久。還是oneLabel還是不顯示。

嘗試修改三:
在賦值處修改用frame給self.TwoImageView布局 且不重新設(shè)置oneLabel的約束

-(void)setModel:(Model*)model {
  self.oneLabel.text = @"這里做一個測試數(shù)據(jù)的展示";      
 DLog(@"..self.oneLabel.frame==%@",NSStringFromCGRect(self.oneLabel.frame));
self.TwoImageView.frame = CGRectMake(CGRectGetMaxX(self.oneLabel.frame)+4,CGRectGetMinY(self.oneLabel.frame)+4,56,17);
DLog(@"..self.TwoImageView.frame==%@",NSStringFromCGRect(self.TwoImageView.frame));
打印出來數(shù)據(jù)會出現(xiàn)寬度和高度為0 的情況忍弛。導(dǎo)致self.TwoImageView.frame設(shè)置出來也有誤差响迂。

這樣在滑動復(fù)用的時候就出現(xiàn)了 遮蓋問題。

}
最后翻閱了一些資料 如何能夠很好把一下幾個點(diǎn)結(jié)合起來(懶加載布局Cell子控件细疚,在layoutSubviews中寫約束蔗彤,Cell內(nèi)部有動態(tài)且依賴的組件塊,純Masory動態(tài)布)
這幾個點(diǎn)都結(jié)合起來的方法 還是沒有翻閱到疯兼。
當(dāng)然查詢還是有收獲的然遏。
借鑒了一下文章:https://juejin.im/post/5a3238876fb9a0451c3a6af7https://blog.csdn.net/MinggeQingchun/article/details/102677233

改造了下實(shí)現(xiàn)方法吧彪。還是正確處理這個問題了待侵。
以下是改動點(diǎn)。

  1. 這個新增一個約束方法 添加控件之后做約束姨裸,不在-(void)layoutSubviews里面去做秧倾。
-(instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    if (self =[super initWithStyle:style reuseIdentifier:reuseIdentifier]) {

        [self.contentView addSubview:self.oneLabel];
        [self.contentView addSubview:self.TwoImageView]怨酝;
         [self masoryForSubViews];
    }
    return  self;
}

-(void)masoryForSubViews {
  //這里設(shè)置約束代碼
[self.oneLabel mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.equalTo(self.contentView).offset(16);
        make.top.equalTo(self.contentView).offset(20);
        make.height.mas_equalTo(24);
    }];
//這里只對oneLabel做了約束 
}

2.改造賦值方法

-(void)setModel:(Model*)model {
  self.oneLabel.text = @"這里做一個測試數(shù)據(jù)的展示"; 

//這個方法使得self.oneLabel 約束完畢的frame不再為0
 [self layoutIfNeeded];
 DLog(@"..self.oneLabel.frame==%@",NSStringFromCGRect(self.oneLabel.frame));
//用frame給TwoImageView 設(shè)置frame
self.TwoImageView.frame = CGRectMake(CGRectGetMaxX(self.oneLabel.frame)+4,CGRectGetMinY(self.oneLabel.frame)+4,56,17);
DLog(@"..self.TwoImageView.frame==%@",NSStringFromCGRect(self.TwoImageView.frame));

}
這樣的話 這個問題也可以正常展示。打印出來的frame和展示出來都是正確的那先。
問題是解決了农猬,還是對懶加載布局Cell子控件、在layoutSubviews中寫約束售淡、Cell內(nèi)部有動態(tài)且依賴的組件塊斤葱、純Masory動態(tài)布
、這幾個條件同事存在情況下 如何處理比較有疑問揖闸。這里先記錄下這個問題揍堕。如果有幸這篇文章能被哪位大神看到,還希望大神能給予指點(diǎn)楔壤。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鹤啡,一起剝皮案震驚了整個濱河市惯驼,隨后出現(xiàn)的幾起案子蹲嚣,更是在濱河造成了極大的恐慌,老刑警劉巖祟牲,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件隙畜,死亡現(xiàn)場離奇詭異,居然都是意外死亡说贝,警方通過查閱死者的電腦和手機(jī)议惰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來乡恕,“玉大人言询,你說我怎么就攤上這事“烈耍” “怎么了运杭?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長函卒。 經(jīng)常有香客問我辆憔,道長,這世上最難降的妖魔是什么报嵌? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任虱咧,我火速辦了婚禮,結(jié)果婚禮上锚国,老公的妹妹穿的比我還像新娘腕巡。我一直安慰自己,他們只是感情好血筑,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布逸雹。 她就那樣靜靜地躺著营搅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪梆砸。 梳的紋絲不亂的頭發(fā)上转质,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機(jī)與錄音帖世,去河邊找鬼休蟹。 笑死,一個胖子當(dāng)著我的面吹牛日矫,可吹牛的內(nèi)容都是我干的赂弓。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼哪轿,長吁一口氣:“原來是場噩夢啊……” “哼盈魁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起窃诉,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤杨耙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后飘痛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體珊膜,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年宣脉,在試婚紗的時候發(fā)現(xiàn)自己被綠了车柠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡塑猖,死狀恐怖竹祷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情羊苟,我是刑警寧澤塑陵,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站践险,受9級特大地震影響猿妈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜巍虫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一彭则、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧占遥,春花似錦俯抖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽尤揣。三九已至,卻和暖如春柬祠,著一層夾襖步出監(jiān)牢的瞬間北戏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工漫蛔, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嗜愈,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓莽龟,卻偏偏與公主長得像蠕嫁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子毯盈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評論 2 345

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