iOS重拾直播系列-直播聊天室

直播問(wèn)題交流可加群 379258188 備注簡(jiǎn)書

此篇為重拾直播系列的第一篇逆害,基于之前的項(xiàng)目聊天室進(jìn)行了重構(gòu)和優(yōu)化碾盟!
優(yōu)化點(diǎn):1.使用自定義的融云消息類型 2.優(yōu)化聊天室cell高度計(jì)算方式

當(dāng)前項(xiàng)目效果展示:


直播間

此demo使用的是映客直播流括享,侵刪

直播間的消息使用的是融云直播聊天室方案愉粤,使用了自定義消息類型

  • 文本消息(包括彈幕)
  • 點(diǎn)贊消息
  • 禮物消息
  • 特效消息(進(jìn)場(chǎng)特效杀迹,全局禮物通知特效,GIF圖中為展示)

在這里先把消息類型略過(guò)劣针,在后面的文章中會(huì)介紹校镐,本次在介紹聊天室的實(shí)現(xiàn)

直播聊天室的要求:

  • 富文本展示(等級(jí)+用戶姓名+禮物縮略圖)
  • 文本消息 (看我的大白眼進(jìn)入了直播間,看我的大白眼關(guān)注了主播...)
  • 不卡頓(滾動(dòng)流暢酿秸,高度計(jì)算準(zhǔn)確)

cell高度計(jì)算的思考

配合Masonry實(shí)現(xiàn)TableViewCell的高度自適應(yīng)灭翔,以及更易管理的高度緩存
這個(gè)文章的的方案思考比較深刻,再次我就不重復(fù)了辣苏!原本打算使用上述的方案中動(dòng)態(tài)高度四:緩存高度,但是在使用過(guò)程了和設(shè)計(jì)需求有出入肝箱!不使用此方案還有一個(gè)重要原因,可以看我末尾補(bǔ)充稀蟋。

聊天區(qū)域

背后的灰色是根據(jù)文本長(zhǎng)度改變的

最終方案:
使用YYLabel中的YYTextLayout計(jì)算高度

    YYTextContainer *container = [YYTextContainer containerWithSize:CGSizeMake(RCCRMsgW - 10.0f, MAXFLOAT)];
    YYTextLayout *textLayout = [YYTextLayout layoutWithContainer:container text:self.messsageLabel.attributedText];
    CGSize __labelSize = textLayout.textBoundingSize;
   // 留出文本的上下間距增加15的高度
    return __labelSize.height + 15;

RCDLiveTextMessageCell.h

@interface RCDLiveTextMessageCell : UITableViewCell

@property (nonatomic, strong) RCCRMessageModel *model;

- (CGFloat)heightForModel:(RCCRMessageModel *)message;
@end

RCDLiveTextMessageCell.m

@interface RCDLiveTextMessageCell()

/*!
 顯示消息內(nèi)容的Label
 */
@property(nonatomic, strong) YYLabel *messsageLabel;

@property (nonatomic, strong) UIView *bgView;

@end

@implementation RCDLiveTextMessageCell


- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
        self.selectionStyle = UITableViewCellSelectionStyleNone;
        self.backgroundColor = [UIColor clearColor];
        [self.contentView addSubview:self.bgView];
        [self.contentView addSubview:self.messsageLabel];
    }
    return self;
}

- (void)setModel:(RCCRMessageModel *)model {
    
    _model = model;
    // 進(jìn)行數(shù)據(jù)賦值
    // 創(chuàng)建一個(gè)可變屬性字符串
    NSMutableAttributedString *finalStr = [[NSMutableAttributedString alloc]init];
    UIFont *font = [UIFont systemFontOfSize:15];
    NSMutableParagraphStyle *paragraphStyle = [NSMutableParagraphStyle new];
    paragraphStyle.lineSpacing = 3;
 
    UIImage *image = [UIImage imageNamed:@"dengji_1"]; // 測(cè)試數(shù)據(jù)
    NSMutableAttributedString *attachText = [NSMutableAttributedString attachmentStringWithContent:image contentMode:UIViewContentModeCenter attachmentSize:image.size alignToFont:font alignment:YYTextVerticalAlignmentCenter];
    [finalStr appendAttributedString:attachText];
    [finalStr appendAttributedString:[[NSAttributedString alloc] initWithString:model.name attributes:@{NSFontAttributeName : font,NSForegroundColorAttributeName:[UIColor whiteColor]}]];
    
    [finalStr appendAttributedString:[[NSAttributedString alloc] initWithString:model.message attributes:@{NSFontAttributeName : font,NSForegroundColorAttributeName:[UIColor yellowColor],NSParagraphStyleAttributeName:paragraphStyle}]];
    
    [finalStr addAttributes:@{NSParagraphStyleAttributeName:paragraphStyle} range:NSMakeRange(0, finalStr.length)];

    
    self.messsageLabel.attributedText = finalStr;
    
    // 很關(guān)鍵 寬度一定要準(zhǔn)確 (250 是tableview的寬度,-10是讓文本左右留出10的寬度)
    YYTextContainer *container = [YYTextContainer containerWithSize:CGSizeMake(250 - 10.0f, MAXFLOAT)];
    YYTextLayout *textLayout = [YYTextLayout layoutWithContainer:container text:self.messsageLabel.attributedText];
    self.messsageLabel.textLayout = textLayout;
    
    self.messsageLabel.frame = CGRectMake(4,4, textLayout.textBoundingSize.width, textLayout.textBoundingSize.height);
    self.bgView.frame = CGRectMake(0, 0, self.messsageLabel.width + 8, self.messsageLabel.height + 6);
}


// 根絕數(shù)據(jù)計(jì)算cell的高度
- (CGFloat)heightForModel:(RCCRMessageModel *)message {
    
    [self setModel:message];
    // 很關(guān)鍵
    YYTextContainer *container = [YYTextContainer containerWithSize:CGSizeMake(250 - 10.0f, MAXFLOAT)];
    YYTextLayout *textLayout = [YYTextLayout layoutWithContainer:container text:self.messsageLabel.attributedText];
    CGSize __labelSize = textLayout.textBoundingSize;
    return __labelSize.height + 15;
}

#pragma mark - lazy
- (YYLabel *)messsageLabel {
    
    if (_messsageLabel == nil) {
        _messsageLabel = [[YYLabel alloc]init];
        _messsageLabel.numberOfLines = 0;
        _messsageLabel.textAlignment = NSTextAlignmentLeft;
        _messsageLabel.lineBreakMode = NSLineBreakByCharWrapping;
        _messsageLabel.displaysAsynchronously = YES;
        _messsageLabel.textVerticalAlignment = YYTextVerticalAlignmentCenter;
    }
    return _messsageLabel;
}

- (UIView *)bgView {
    if (_bgView == nil) {
        _bgView = [[UIView alloc]init];
        _bgView.backgroundColor = [[UIColor blackColor]colorWithAlphaComponent:0.25];
        // 如果切原價(jià)卡頓的話,可以使用背景圖
        _bgView.layer.cornerRadius = 4;
        _bgView.layer.masksToBounds = YES;
    }
    return _bgView;
}

@end

高度計(jì)算

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    
    RCCRMessageModel *model = [self.conversationDataRepository objectAtIndex:indexPath.row];
    if (model.cellHeight == 0) {
        
        CGFloat cellHeight = [self.tempMsgCell heightForModel:model];
        model.cellHeight = cellHeight;
        return cellHeight;
        
    }else{
        return model.cellHeight;
    }
}

本文demo https://github.com/TsuiOS/HsuLive

補(bǔ)充

  • 如果實(shí)現(xiàn)映客等主流平臺(tái)聊天區(qū)域頂部漸隱消失效果
    iOS 仿花椒直播聊天室消息列表漸隱消失效果
    實(shí)際解決方案:
    要為聊天區(qū)域新建一個(gè)containerView,給containerView設(shè)置頂部漸變效果

  • 為什么不使用參考的方案四

// 根絕數(shù)據(jù)計(jì)算cell的高度
- (CGFloat)heightForModel:(CellModel *)message {
    [self setMessage:message];
    [self layoutIfNeeded];
    
    CGFloat cellHeight = [self.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height+1;
    
    return cellHeight;
}

如果消息加載過(guò)快煌张,cell的出現(xiàn)方式就會(huì)有問(wèn)題:
GIF圖不是特別明顯,可以自己運(yùn)行demo看效果


systemLayoutSizeFittingSize

使用YYTextLayout

YYTextLayout

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市退客,隨后出現(xiàn)的幾起案子骏融,更是在濱河造成了極大的恐慌,老刑警劉巖萌狂,帶你破解...
    沈念sama閱讀 211,348評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件档玻,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡茫藏,警方通過(guò)查閱死者的電腦和手機(jī)误趴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門幸冻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)屯烦,“玉大人,你說(shuō)我怎么就攤上這事嚷缭∈燮希” “怎么了看杭?”我有些...
    開(kāi)封第一講書人閱讀 156,936評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)挟伙。 經(jīng)常有香客問(wèn)我楼雹,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 56,427評(píng)論 1 283
  • 正文 為了忘掉前任烘豹,我火速辦了婚禮瓜贾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘携悯。我一直安慰自己祭芦,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,467評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布憔鬼。 她就那樣靜靜地躺著龟劲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪轴或。 梳的紋絲不亂的頭發(fā)上昌跌,一...
    開(kāi)封第一講書人閱讀 49,785評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音照雁,去河邊找鬼蚕愤。 笑死,一個(gè)胖子當(dāng)著我的面吹牛饺蚊,可吹牛的內(nèi)容都是我干的萍诱。 我是一名探鬼主播,決...
    沈念sama閱讀 38,931評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼污呼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼裕坊!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起燕酷,我...
    開(kāi)封第一講書人閱讀 37,696評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤籍凝,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后苗缩,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體饵蒂,經(jīng)...
    沈念sama閱讀 44,141評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,483評(píng)論 2 327
  • 正文 我和宋清朗相戀三年酱讶,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了退盯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,625評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡浴麻,死狀恐怖得问,靈堂內(nèi)的尸體忽然破棺而出囤攀,到底是詐尸還是另有隱情软免,我是刑警寧澤,帶...
    沈念sama閱讀 34,291評(píng)論 4 329
  • 正文 年R本政府宣布焚挠,位于F島的核電站膏萧,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜榛泛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,892評(píng)論 3 312
  • 文/蒙蒙 一蝌蹂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧曹锨,春花似錦孤个、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至椒楣,卻和暖如春给郊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背捧灰。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工淆九, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人毛俏。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓炭庙,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親拧抖。 傳聞我的和親對(duì)象是個(gè)殘疾皇子煤搜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,492評(píng)論 2 348

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

  • 1、通過(guò)CocoaPods安裝項(xiàng)目名稱項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫(kù)組件 SD...
    陽(yáng)明先生_X自主閱讀 15,969評(píng)論 3 119
  • 一唧席、四個(gè)收獲 (一)要主動(dòng)選擇命運(yùn)擦盾,而不是被命運(yùn)選擇 我常聽(tīng)到一句話:七分天注定,三分靠打拼淌哟。聽(tīng)的時(shí)間長(zhǎng)了迹卢,也就慢...
    多做減法閱讀 185評(píng)論 2 1
  • (一)衰老的機(jī)器,母親大人…… 【上有老下有小】今晨徒仓,可兒奶奶身體大為改觀腐碱! 小安心感冒也基本恢復(fù)了,她今天開(kāi)學(xué)掉弛。...
    拈花老夏閱讀 1,048評(píng)論 0 3
  • 什么才是最好的表達(dá)方式症见,當(dāng)然是講故事了。 一殃饿、故事是我們認(rèn)知這個(gè)世界的方式谋作。人不是原原本本地復(fù)制過(guò)去...
    會(huì)飛的興興閱讀 1,042評(píng)論 0 0
  • 遵蚜,
    歸兮離兮閱讀 43評(píng)論 0 0