Masonry 布局 cell高度適應(yīng)的一種方案(實現(xiàn)類似朋友圈簡單布局)

前言: 我模仿的是微博的布局所以也就沒有 評論動態(tài)刷新cell.

  1. 什么人群適合看?

好奇Masonry使用的, 聽過沒用過, 沒有深入的接觸過的 可以看.

  1. 為什么要寫?

很多文章都是這個原因 1 備忘 2 給需要的人 -.-

  1. 這篇可以了解哪些?

Masonry + HYBMasonryAutoCellHeight + TTTAttributedLabel + 話題正則 + 表情正則 + 鏈接 同時感謝作者開源
這里圖片瀏覽器使用的 SDPhotoBrowser

  1. 使用方便嗎?

使用很方便, 不需要通過文本的寬度計算高度來自適應(yīng)label了, 使用Masonry 在iOS10 貌似沒有出現(xiàn)因為像素點原因, 而顯示不完全的問題~

我用類似于微博界面的樣式進行測試的 so最帥的頭像就是我的微博啦
我用類似于微博界面的樣式進行測試的 so最帥的頭像就是我的微博啦
我用類似于微博界面的樣式進行測試的 so最帥的頭像就是我的微博啦

下面進入正題代碼的實現(xiàn)~

布局cell上的子控件

        // Masonry布局
        // 頭像
        [_headerImageView mas_makeConstraints:^(MASConstraintMaker *make) {
            // 進行約束設(shè)置
            make.top.left.equalTo(self.contentView).with.offset(SPACE);
            make.width.height.mas_equalTo(33);
        }];
        // 昵稱
        // 文本內(nèi)容要顯示多長
        _labelName.preferredMaxLayoutWidth = SCREEN_W - 63;
        _labelName.numberOfLines = 0;
        [_labelName mas_makeConstraints:^(MASConstraintMaker *make) {
            make.top.equalTo(self.contentView).with.offset(SPACE);
            make.left.equalTo(self.headerImageView.mas_right).with.offset(SPACE);
            make.right.equalTo(self.contentView).with.offset(-SPACE);
        }];
        // 時間
        _labelTime.preferredMaxLayoutWidth = SCREEN_W - 63;
        _labelTime.numberOfLines = 0;
        [_labelTime mas_makeConstraints:^(MASConstraintMaker *make) {
            make.top.equalTo(self.labelName.mas_bottom).with.offset(SPACE); // 空隙 為 10(SPACE)
            make.left.right.equalTo(self.labelName);
        }];
        // 發(fā)布的內(nèi)容
        // 視圖是多寬的 進行相應(yīng)的設(shè)置
        self.labelText.preferredMaxLayoutWidth = SCREEN_W - 63;
        _labelText.numberOfLines = 0;
        [_labelText mas_makeConstraints:^(MASConstraintMaker *make) {
            make.top.equalTo(self.labelTime.mas_bottom).with.offset(SPACE);
            make.left.right.mas_equalTo(self.labelTime);
        }];
        // 自動檢測鏈接
        _labelText.enabledTextCheckingTypes = NSTextCheckingTypeLink;
        // 圖片瀏覽器
        [_photosGroup mas_makeConstraints:^(MASConstraintMaker *make) {
            //
            make.top.equalTo(self.labelText.mas_bottom).with.offset(SPACE);
            make.left.equalTo(self.labelText);
            make.width.mas_equalTo(SCREEN_W - 63);
        }];

方法賦值 賦值 - 并且更新需要更新的布局

#pragma mark - 賦值
- (void)configCellWithModel:(CommonModel *)model user:(User *)userModel
{
    // 頭像
    [_headerImageView sd_setImageWithURL:[NSURL URLWithString:userModel.profile_image_url] placeholderImage:nil];
    _labelName.text = [NSString stringWithFormat:@"%@ %@", userModel.name, @"我測試cell的高度是否準(zhǔn)確, 我測試cell的高度是否準(zhǔn)確"];
    _labelTime.text = [NSString stringWithFormat:@"%@ %@", model.created_at, @"我測試cell的高度是否準(zhǔn)確, 我測試cell的高度是否準(zhǔn)確"];;
    // 發(fā)布的內(nèi)容
    _labelText.text = model.text;
    // 計算Photo的height
    // 這里用到了類似朋友圈的九宮格布局所以我進行了相應(yīng)的計算
    CGFloat pg_Height = 0.0;
    if (model.pic_urls.count > 1 && model.pic_urls.count <= 3) {
        pg_Height = (SCREEN_W - 73) / 3 + 5;
    }else if(model.pic_urls.count > 3 && model.pic_urls.count <= 6)
    {
        pg_Height = (SCREEN_W - 73) / 3 * 2 + 10;
    }else if (model.pic_urls.count > 6 && model.pic_urls.count <= 9)
    {
        pg_Height = (SCREEN_W - 73) + 15;
    }else if (model.pic_urls.count == 1)
    {
        // 單張圖片 為 4/7
        pg_Height = (SCREEN_W - 63) * 4 / 7 + 5;
    }
    else
    {
        pg_Height = 0.0;
    }
    // 同時九宮格進行更新約束
    [_photosGroup mas_updateConstraints:^(MASConstraintMaker *make) {
        make.height.mas_equalTo(pg_Height);
    }];
}

在返回cell高度的方法中

#pragma mark - 返回 Cell的高度
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    CommonModel *model = self.dataArray[indexPath.row];
    User *user = self.userArray[indexPath.row];
    CGFloat cellHeight = [CommonTableViewCell hyb_heightForTableView:tableView config:^(UITableViewCell *sourceCell) {
        //
        CommonTableViewCell *cell = (CommonTableViewCell *)sourceCell;
        // 進行模型方法賦值-傳進cell
        [cell configCellWithModel:model user:user];
    } cache:^NSDictionary *{
        return @{kHYBCacheUniqueKey: [NSString stringWithFormat:@"%@", model.id],
                 kHYBCacheStateKey : @"",
                 kHYBRecalculateForStateKey : @(NO) // 標(biāo)識不用重新更新
                 };
    }];
    return cellHeight;
}

除去以上這些你可能還好奇 話題+表情+鏈接如何實現(xiàn)識別可點擊的
寫一個工具類

// .h
/// 話題正則 例如 #夏天帥不帥#
+ (NSRegularExpression *)regexTopic;

/// 表情正則 例如 [偷笑]
+ (NSRegularExpression *)regexEmoticon;
// .m
+ (NSRegularExpression *)regexTopic {
    static NSRegularExpression *regex;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        regex = [NSRegularExpression regularExpressionWithPattern:@"#[^@#]+?#" options:kNilOptions error:NULL];
    });
    return regex;
}

+ (NSRegularExpression *)regexEmoticon {
    static NSRegularExpression *regex;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        regex = [NSRegularExpression regularExpressionWithPattern:@"\\[[^ \\[\\]]+?\\]" options:kNilOptions error:NULL];
    });
    return regex;
}

然后在cell中進行使用檢測文字

    // 話題檢測
    NSArray *results = [[XTWBStatusHelper regexTopic] matchesInString:model.text options:0 range:NSMakeRange(0, model.text.length)];
    for (NSTextCheckingResult *result in results) {
        // 話題范圍
        NSLog(@"range === %@", NSStringFromRange(result.range));
        [_labelText addLinkWithTextCheckingResult:result];
    }
    // 表情檢測
    NSArray *results1 = [[XTWBStatusHelper regexEmoticon] matchesInString:model.text options:0 range:NSMakeRange(0, model.text.length)];
    for (NSTextCheckingResult *result in results1) {
        // 表情范圍
        NSLog(@"range === %@", NSStringFromRange(result.range));
        [_labelText addLinkWithTextCheckingResult:result];
    }

TTTAttributedLabel的簡單使用 --- 點擊了話題和鏈接 -- 簽訂協(xié)議 指定代理人 實現(xiàn)協(xié)議方法

/// 點擊鏈接的方法
- (void)attributedLabel:(TTTAttributedLabel *)label
   didSelectLinkWithURL:(NSURL *)url
{
    NSLog(@"被點擊的url === %@", url);
}

/// 點擊長按數(shù)據(jù)
- (void)attributedLabel:(TTTAttributedLabel *)label
  didSelectLinkWithDate:(NSDate *)date
{
    
}

/// 點擊文本鏈接
- (void)attributedLabel:(TTTAttributedLabel *)label
didSelectLinkWithTextCheckingResult:(NSTextCheckingResult *)result
{
    NSLog(@"被點擊的話題 === %@", NSStringFromRange(result.range))

}
/// 長按鏈接的方法
- (void)attributedLabel:(TTTAttributedLabel *)label
didLongPressLinkWithURL:(NSURL *)url
                atPoint:(CGPoint)point
{
    NSLog(@"被長按的url === %@", url);
}
/// 可以長按的文本
- (void)attributedLabel:(TTTAttributedLabel *)label
didLongPressLinkWithTextCheckingResult:(NSTextCheckingResult *)result
                atPoint:(CGPoint)point
{
    NSLog(@"被長按的話題 === %@", NSStringFromRange(result.range))
}

檢測結(jié)果打印

總結(jié): Masonry對cell的處理 我的邏輯是這樣的, 對你有幫助點個喜歡/關(guān)注, 如果您有更好的方案, 請與我交流, 謝謝~.

疑問: 為什么簡書Markdown不支持html標(biāo)簽

文/ 夏天然后

End

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市篡撵,隨后出現(xiàn)的幾起案子判莉,更是在濱河造成了極大的恐慌,老刑警劉巖育谬,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件券盅,死亡現(xiàn)場離奇詭異,居然都是意外死亡膛檀,警方通過查閱死者的電腦和手機锰镀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來咖刃,“玉大人泳炉,你說我怎么就攤上這事『垦睿” “怎么了花鹅?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長枫浙。 經(jīng)常有香客問我刨肃,道長,這世上最難降的妖魔是什么箩帚? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任真友,我火速辦了婚禮,結(jié)果婚禮上紧帕,老公的妹妹穿的比我還像新娘盔然。我一直安慰自己,他們只是感情好是嗜,可當(dāng)我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布愈案。 她就那樣靜靜地躺著,像睡著了一般叠纷。 火紅的嫁衣襯著肌膚如雪刻帚。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天涩嚣,我揣著相機與錄音崇众,去河邊找鬼掂僵。 笑死,一個胖子當(dāng)著我的面吹牛顷歌,可吹牛的內(nèi)容都是我干的锰蓬。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼眯漩,長吁一口氣:“原來是場噩夢啊……” “哼芹扭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起赦抖,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤舱卡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后队萤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體轮锥,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年要尔,在試婚紗的時候發(fā)現(xiàn)自己被綠了舍杜。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡赵辕,死狀恐怖既绩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情还惠,我是刑警寧澤饲握,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站吸重,受9級特大地震影響互拾,放射性物質(zhì)發(fā)生泄漏歪今。R本人自食惡果不足惜嚎幸,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望寄猩。 院中可真熱鬧嫉晶,春花似錦、人聲如沸田篇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽泊柬。三九已至椎镣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間兽赁,已是汗流浹背状答。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工冷守, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人惊科。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓拍摇,卻偏偏與公主長得像,于是被迫代替她去往敵國和親馆截。 傳聞我的和親對象是個殘疾皇子充活,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,697評論 2 351

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