iOS環(huán)信自定義消息cell(名片)

記錄環(huán)信消息cell自定義,方便后續(xù)使用冻记。此自定義是直接在環(huán)信Demo上進行修改,整體思路還是根據(jù)環(huán)信官方文檔提供來做的来惧,部分有所改動冗栗。

2018-01-23 下午2.06.44.png

一、自定義cell违寞,繼承至環(huán)信【EaseBaseMessageCell】

1贞瞒、EaseMedicineCell.h內(nèi)容

#import <EaseUI/EaseUI.h>

@interface EaseMedicineCell : EaseBaseMessageCell

@end

2、EaseMedicineCell.m內(nèi)容趁曼,※注:此類中重寫父類的方法不要遺漏军浆,不然報錯※

#import "EaseMedicineCell.h"
#define cellHeight 116
#define bubbleViewHeight cellHeight - 15 // 氣泡背景圖高度

@interface EaseMedicineCell ()
/** 標題 */
@property (nonatomic, strong) UILabel *titleLb;
/** 描述 */
@property (nonatomic, strong) UILabel *describeLb;
/** 圖片 */
@property (nonatomic, strong) UIImageView *iconImgView;
/** 分割線 */
@property (nonatomic, strong) UIView *lienView;
/** 底部 圖片+文字 but */
@property (nonatomic, strong) UIButton *bottomView;
@end

@implementation EaseMedicineCell

#pragma mark - 系統(tǒng)回調(diào)
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier model:(id<IMessageModel>)model
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier model:model];
    if (self) {
        // 添加子控件
        [self setupSubViewWithModel:model];
        self.selectionStyle = UITableViewCellSelectionStyleNone;
    }
    return self;
}

#pragma mark - 重寫父類方法
/** 獲取cell的reuseIdentifier */
+ (NSString *)cellIdentifierWithModel:(id<IMessageModel>)model
{
    return @"EaseMedicineCell";
}

/** 獲取cell高度 */
+ (CGFloat)cellHeightWithModel:(id<IMessageModel>)model
{
    return cellHeight;
}

/** 判斷是否需要自定義氣泡 */
- (BOOL)isCustomBubbleView:(id<IMessageModel>)model
{
    return YES;
}

/** 根據(jù)消息model變更氣泡樣式 */
- (void)setCustomModel:(id<IMessageModel>)model
{
    UIImage *image = model.image;
    if (!image) {
        [self.bubbleView.imageView sd_setImageWithURL:[NSURL URLWithString:model.fileURLPath] placeholderImage:[UIImage imageNamed:model.failImageName]];
    } else {
        _bubbleView.imageView.image = image;
    }
    
    if (model.avatarURLPath) {
        [self.avatarView sd_setImageWithURL:[NSURL URLWithString:model.avatarURLPath] placeholderImage:model.avatarImage];
    } else {
        self.avatarView.image = model.avatarImage;
    }
}

/** 根據(jù)消息改變氣泡樣式 */
- (void)setCustomBubbleView:(id)model{
    _bubbleView.imageView.image = [UIImage imageNamed:@"imageDownloadFail"];
}

/** 更新自定義氣泡的邊距 */
- (void)updateCustomBubbleViewMargin:(UIEdgeInsets)bubbleMargin model:(id<IMessageModel>)mode
{
    _bubbleView.translatesAutoresizingMaskIntoConstraints = YES;
    CGFloat nameLabelHeight = 15;// 昵稱label的高度
    if (mode.isSender) {
        _bubbleView.frame =
        CGRectMake([UIScreen mainScreen].bounds.size.width - 273.5, nameLabelHeight, 213, bubbleViewHeight);
    }else{
        _bubbleView.frame = CGRectMake(55, nameLabelHeight, 213, bubbleViewHeight);
    }
}

#pragma mark - 私有方法
/** 添加子控件 */
- (void)setupSubViewWithModel:(id<IMessageModel>)model
{
    NSLog(@"擴展消息 === %@",model.message.ext);
    self.hasRead.hidden = YES;
    [self.bubbleView.backgroundImageView addSubview:self.titleLb];
    [self.bubbleView.backgroundImageView addSubview:self.describeLb];
    [self.bubbleView.backgroundImageView addSubview:self.iconImgView];
    [self.bubbleView.backgroundImageView addSubview:self.lienView];
    [self.bubbleView.backgroundImageView addSubview:self.bottomView];
}

#pragma mark - lazy
- (UILabel *)titleLb
{
    if (!_titleLb) {
        _titleLb = [[UILabel alloc] initWithFrame:CGRectMake(15, 15, 150, 15)];
        _titleLb.text = @"專屬運動處方";
        _titleLb.textColor = [UIColor blackColor];
        _titleLb.font = [UIFont systemFontOfSize:13];
    }
    return _titleLb;
}

- (UILabel *)describeLb
{
    if (!_describeLb) {
        _describeLb = [[UILabel alloc] initWithFrame:CGRectMake(15, 15+15+2, 180, 15)];
        _describeLb.text = @"科學(xué)運動處方";
        _describeLb.textColor = [UIColor grayColor];
        _describeLb.font = [UIFont systemFontOfSize:11];
    }
    return _describeLb;
}

- (UIImageView *)iconImgView
{
    if (!_iconImgView) {
        _iconImgView = [[UIImageView alloc] initWithFrame:CGRectMake(213 - 40 - 20, 15+15+2, 40, 40)];
        _iconImgView.image = [UIImage imageNamed:@"sports"];
    }
    return _iconImgView;
}

- (UIView *)lienView
{
    if (!_lienView) {
        _lienView = [[UIView alloc] initWithFrame:CGRectMake(2, bubbleViewHeight - 20, 213-11, 0.5)];
        _lienView.backgroundColor = [UIColor grayColor];
    }
    return _lienView;
}

- (UIButton *)bottomView
{
    if (!_bottomView) {
        _bottomView = [UIButton buttonWithType:UIButtonTypeCustom];
        _bottomView.frame = CGRectMake(0, bubbleViewHeight - 20, 90, 20);
        _bottomView.backgroundColor = [UIColor clearColor];
        [_bottomView setTitle:@"運動處方" forState:UIControlStateNormal];
        [_bottomView setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];
        _bottomView.titleEdgeInsets = UIEdgeInsetsMake(0, 0, 0, -10);
        [_bottomView setImage:[UIImage imageNamed:@"sports_icon"] forState:UIControlStateNormal];
        _bottomView.titleLabel.font = [UIFont systemFontOfSize:11];
    }
    return _bottomView;
}

@end

二、控制器判斷是否顯示自定義消息cell

注:※我這是直接在紅包控制器(RedPacketChatViewController)進行判斷的挡闰,項目中可以自己寫一個類繼承ChatViewController去實現(xiàn)乒融,原理一樣∩忝酰※

1赞季、修改自定義cell的頭像
2018-01-23 下午2.27.23.png

2、在- (UITableViewCell *)messageViewController: (UITableView *)tableView cellForMessageModel (id<IMessageModel>)messageModel 方法中進行判斷是否顯示自定義消息cell【注:在此的判斷在下方 5奢驯、中說明】
2018-01-23 下午2.35.23.png

3申钩、在- (CGFloat)messageViewController:(EaseMessageViewController *)viewController heightForMessageModel:(id<IMessageModel>)messageModel withCellWidth:(CGFloat)cellWidth方法中返回自定義消息cell的高度
2018-01-23 下午2.32.46.png

4、在- (void)messageViewController:(EaseMessageViewController *)viewController didSelectMoreView:(EaseChatBarMoreView *)moreView AtIndex:(NSInteger)index方法中找到觸發(fā)按鈕瘪阁,實現(xiàn)發(fā)送自定義消息cell

2018-01-23 下午2.42.29.png

4.1撒遣、[self sendPrescription] 方法實現(xiàn):

2018-01-23 下午2.44.10.png

5、判斷說明:在環(huán)信的EaseMessageViewController.m的- (void)messageCellSelected:(id<IMessageModel>)model方法中添加一個case管跺。

2018-01-23 下午2.48.29.png

5.1义黎、上面自己添加的case中代理方法

2018-01-23 下午2.51.28.png

6、還是在紅包控制器(RedPacketChatViewController)中實現(xiàn)代理(因為直接在紅包控制器修改的代碼豁跑,所以還在這個控制器實現(xiàn))廉涕,在代理方法中根據(jù)需求做相應(yīng)操作。

2018-01-23 下午2.53.58.png

至此已經(jīng)基本實現(xiàn)自定義消息cell功能艇拍。后期可以根據(jù)自己需求進行優(yōu)化狐蜕。最后總結(jié)一下大概步驟: ①新建cell --> ②判斷cell類型來顯示cell及高度 --> ③觸發(fā)自定義cell,發(fā)送顯示消息 --> ④實現(xiàn)代理完成操作

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末卸夕,一起剝皮案震驚了整個濱河市层释,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌娇哆,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異碍讨,居然都是意外死亡治力,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門勃黍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宵统,“玉大人,你說我怎么就攤上這事覆获÷沓海” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵弄息,是天一觀的道長痊班。 經(jīng)常有香客問我,道長摹量,這世上最難降的妖魔是什么涤伐? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮缨称,結(jié)果婚禮上凝果,老公的妹妹穿的比我還像新娘。我一直安慰自己睦尽,他們只是感情好器净,可當(dāng)我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著当凡,像睡著了一般山害。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宁玫,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天粗恢,我揣著相機與錄音,去河邊找鬼欧瘪。 笑死眷射,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的佛掖。 我是一名探鬼主播妖碉,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼芥被!你這毒婦竟也來了欧宜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤拴魄,失蹤者是張志新(化名)和其女友劉穎冗茸,沒想到半個月后席镀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡夏漱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年豪诲,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挂绰。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡屎篱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出葵蒂,到底是詐尸還是另有隱情交播,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布践付,位于F島的核電站秦士,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏荔仁。R本人自食惡果不足惜伍宦,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望乏梁。 院中可真熱鬧次洼,春花似錦、人聲如沸遇骑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽落萎。三九已至亥啦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間练链,已是汗流浹背翔脱。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留媒鼓,地道東北人届吁。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像绿鸣,于是被迫代替她去往敵國和親疚沐。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,452評論 2 348

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