iOS10后使用Masonry進行自動布局出現的問題及處理

iOS10.0系統發布后,做了一些簡單的適配工作(權限,UILabel的大小,導航欄的tintColor等),進行新版本測試突然發現自動布局不好使了。項目中很多地方用到了自適應cell,在iOS10.0之前都是完美運行的。如果此時換成手動計算高度實現自適應,這個工程量還是比較大的。無奈研究了一晚上,終于找到了在iOS10下關于Masonry實現自適應的解決辦法。

一、網上查找的一種處理方法--調整代碼

這是之前在10.0下出問題的代碼

[viewBG mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.equalTo(self.contentView).offset(10*ScaleScreenH);
        make.right.equalTo(self.contentView).offset(-10*ScaleScreenH);
        make.top.equalTo(self.contentView);
        make.height.equalTo(@(viewBG.height));
    }];
    [self.contentView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.equalTo(self);
        make.right.equalTo(self);
        make.top.equalTo(self);
        make.bottom.equalTo(viewBG).offset(15*ScaleScreenH);
    }];

只需要做一個調整,對于viewBG的底部約束,不能寫在contentView的約束里了。至于為什么,我也不清楚。

    [viewBG mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.equalTo(self.contentView).offset(10*ScaleScreenH);
        make.right.equalTo(self.contentView).offset(-10*ScaleScreenH);
        make.top.equalTo(self.contentView);
        make.height.equalTo(@(viewBG.height));
        make.bottom.equalTo(self.contentView).offset(-15*ScaleScreenH);
    }];
    [self.contentView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.edges.equalTo(self);
    }];

二、文字自適應

方法一中,viewBG的高度是已知的,可以通過高度進行約束。
如果你的代碼中是使用label的文字自適應, 那么就有問題了,你需要去手動計算文字的高度,再進行高度適配
如下這種需求(文字無關,隨便復制的)


Simulator Screen Shot 2016年10月12日 下午4.16.41.png

在iOS10之前,我的代碼是這樣寫的:

// 布局
      [self.label mas_makeConstraints:^(MASConstraintMaker *make) {
            make.top.equalTo(self.contentView).offset(10);
            make.left.equalTo(self.contentView).offset(16);
            make.right.equalTo(self.contentView).offset(-16);
        }];
        [self.contentView mas_makeConstraints:^(MASConstraintMaker *make) {
            make.top.left.right.equalTo(self);
            make.bottom.equalTo(self.label.mas_bottom).offset(10);
        }];

出現的問題:每個label的高度都為0,顯示無任何內容
根據方法一進行修改后

// 布局
      [self.label mas_makeConstraints:^(MASConstraintMaker *make) {
            make.top.equalTo(self.contentView).offset(10);
            make.left.equalTo(self.contentView).offset(16);
            make.right.equalTo(self.contentView).offset(-16);
            make.bottom.equalTo(self.contentView).offset(-10);
        }];
        [self.contentView mas_makeConstraints:^(MASConstraintMaker *make) {
            make.edges.equalTo(self);
        }];
Simulator Screen Shot 2016年10月12日 下午4.25.38.png

文字的高度都不正確,全部都只有一行,當cell滾動界面再出現時,才正確
通過調試發現,iOS10之前, layoutSubViews方法在cell初始化時就會調用兩次, 而iOS10之后, layoutSubViews方法只會調用一次
解決方法:1.與方法一配合使用,計算文字的高度,進行高度約束
2.手動使用layoutSubViews多走一次,就可得到正確的高度

- (void)setText:(NSString *)text {
    _text = text;
    
    self.label.text = text;
    // 自動適配并重新布局
    [self.label sizeToFit];// 可以得到label的正確高度
    [self layoutIfNeeded];//會重新調用一次LayoutSubViews
}

結果恢復正常


Simulator Screen Shot 2016年10月12日 下午4.16.41.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容