iOS masonry約束立即生效和約束更新

需求是這樣的檬寂,文本內(nèi)容高度超過半屏琳钉,那么textview高度就是半屏势木,可以滑動顯示內(nèi)容。內(nèi)容不超過半屏歌懒,就按照內(nèi)容高度設置textview高度啦桌。
開始是使用frame布局的,需要計算每個控件的具體位置及皂,當textview高度變化甫男,textview下面放的button和其他view的frame需要重新賦值,因為它們的y值位置變了验烧。使用這種方法太過麻煩板驳,所以想尋找相對簡單的方法。Masonry約束是大多數(shù)人都在使用的碍拆,約束的方法相當多若治。
但是masonry約束布局有延遲,不是調(diào)用了方法感混,控件的位置就能獲取到的端幼。調(diào)用了masonry去約束控件,再立馬去打印控件的frame浩习,你會發(fā)現(xiàn)静暂,frame還是0济丘。
所以當我設置了以下的約束:

    whiteBack = [[UIView alloc] init];
    [self.contentView addSubview:whiteBack];
    
    self.resultTextView = [[UITextView alloc] init];
    self.resultTextView.font = [UIFont boldSystemFontOfSize:36];
    self.resultTextView.textAlignment = NSTextAlignmentCenter;
    [whiteBack addSubview:self.resultTextView];
    
    self.voiceButton = [UIButton buttonWithType:UIButtonTypeCustom];
    [self.voiceButton setImage:kGetImage(@"phrase_detail_voice") forState:UIControlStateNormal];
    [self.voiceButton addTarget:self action:@selector(voiceButtonClicked:) forControlEvents:UIControlEventTouchUpInside];
    [whiteBack addSubview:self.voiceButton];
    
    line = [[UIView alloc] init];
    line.backgroundColor = kLineColor;
    [whiteBack addSubview:line];
    
    self.originTextView = [[UITextView alloc] init];
    self.originTextView.textColor = kHexColor(@"888C98");
    self.originTextView.textAlignment = NSTextAlignmentCenter;
    self.originTextView.font = [UIFont systemFontOfSize:17];
    [whiteBack addSubview:self.originTextView];

    [whiteBack mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.top.bottom.equalTo(self.contentView);
    }];
    
    [self.resultTextView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.offset(25);
        make.right.offset(-25);
        make.top.offset(76);
        make.height.mas_equalTo(40);
    }];
    
    [self.voiceButton mas_makeConstraints:^(MASConstraintMaker *make) {
        make.centerX.equalTo(whiteBack);
        make.top.equalTo(self.resultTextView.mas_bottom).offset(24);
        make.size.mas_equalTo(CGSizeMake(60, 30));
    }];
    
    [line mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.offset(20);
        make.right.offset(-20);
        make.bottom.equalTo(self.voiceButton.mas_bottom).offset(45);
        make.height.mas_equalTo(0.5);
    }];
    
    [self.originTextView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.equalTo(self.resultTextView);
        make.top.equalTo(line.mas_bottom).offset(50);
        make.height.mas_equalTo(40);
    }];

// 剛開始沒有添加下面這句
// [whiteBack layoutIfNeeded];

在調(diào)用接口拿到文本內(nèi)容以后谱秽,我去更新textveiw的高度:

- (float)heightForTextView:(UITextView *)textView withFont:(UIFont *)font {
    
    CGSize constraint = CGSizeMake(textView.contentSize.width-textView.textContainer.lineFragmentPadding*2 , CGFLOAT_MAX);
    CGRect size = [textView.text boundingRectWithSize:constraint
                                             options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading)
                                          attributes:@{NSFontAttributeName: font}
                                             context:nil];
    float textHeight = ceil(size.size.height) + textView.textContainer.lineFragmentPadding*2;
    return textHeight;
}

- (void)resetSubviewsFrame {
    CGFloat otherHeight = 245;
    CGFloat maxHeight = (whiteBack.height - otherHeight)/2;
    
    CGFloat resultH = [self heightForTextView:self.resultTextView withFont:[UIFont boldSystemFontOfSize:36]];
    if (resultH > maxHeight) {
        resultH = maxHeight;
    }
    [self.resultTextView mas_updateConstraints:^(MASConstraintMaker *make) {
        make.height.mas_equalTo(resultH);
    }];
    
    CGFloat originH = [self heightForTextView:self.originTextView withFont:[UIFont systemFontOfSize:17]];
    if (originH > maxHeight) {
        originH = maxHeight;
    }
    [self.originTextView mas_updateConstraints:^(MASConstraintMaker *make) {
        make.height.mas_equalTo(originH);
    }];
    
    [whiteBack layoutIfNeeded];
}

頁面上的兩個textview都沒有顯示出來洽蛀,我來回滑動collectionView幾次,文本才正常顯示出來疟赊。
問題是我計算TextView允許的最大高度時候郊供,使用了它們的父視圖whiteBack的高度,但是使用whiteBack高度時候近哟,它還是0驮审;
解決辦法是在第一次布局時,就使用layoutIfNeeded立即布局吉执,之后再獲取whiteBack的高度就有值了疯淫。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市戳玫,隨后出現(xiàn)的幾起案子熙掺,更是在濱河造成了極大的恐慌,老刑警劉巖咕宿,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件币绩,死亡現(xiàn)場離奇詭異,居然都是意外死亡府阀,警方通過查閱死者的電腦和手機缆镣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來试浙,“玉大人董瞻,你說我怎么就攤上這事√锇停” “怎么了力细?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長固额。 經(jīng)常有香客問我眠蚂,道長,這世上最難降的妖魔是什么斗躏? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任逝慧,我火速辦了婚禮,結(jié)果婚禮上啄糙,老公的妹妹穿的比我還像新娘笛臣。我一直安慰自己,他們只是感情好隧饼,可當我...
    茶點故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布沈堡。 她就那樣靜靜地躺著,像睡著了一般燕雁。 火紅的嫁衣襯著肌膚如雪诞丽。 梳的紋絲不亂的頭發(fā)上鲸拥,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天,我揣著相機與錄音僧免,去河邊找鬼刑赶。 笑死,一個胖子當著我的面吹牛懂衩,可吹牛的內(nèi)容都是我干的撞叨。 我是一名探鬼主播,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼浊洞,長吁一口氣:“原來是場噩夢啊……” “哼牵敷!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起法希,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤劣领,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后铁材,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體尖淘,經(jīng)...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年著觉,在試婚紗的時候發(fā)現(xiàn)自己被綠了村生。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,021評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡饼丘,死狀恐怖趁桃,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情肄鸽,我是刑警寧澤卫病,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站典徘,受9級特大地震影響蟀苛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜逮诲,卻給世界環(huán)境...
    茶點故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一帜平、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧梅鹦,春花似錦裆甩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至箍邮,卻和暖如春茉帅,著一層夾襖步出監(jiān)牢的瞬間叨叙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工担敌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留摔敛,地道東北人廷蓉。 一個月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓全封,卻偏偏與公主長得像,于是被迫代替她去往敵國和親桃犬。 傳聞我的和親對象是個殘疾皇子刹悴,可洞房花燭夜當晚...
    茶點故事閱讀 44,974評論 2 355