| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293 |
- //
- // DKUITableViewCell.m
- // chatandvideotest
- //
- // Created by Dongke on 15/11/18.
- // Copyright © 2015年 dongke. All rights reserved.
- //
- #import "DKUITableViewCell.h"
- static const CGFloat kDKLabelPadding = 5.0f;
- static const CGFloat kDKTimeStampLabelHeight = 20.0f;
- static const CGFloat kDKAvatarPaddingX = 8.0;
- static const CGFloat kDKAvatarPaddingY = 15;
- static const CGFloat kDKUserNameLabelHeight = 20;
- @interface DKUITableViewCell () {
-
- }
- @property (nonatomic, weak, readwrite) DKMessageBubbleView *messageBubbleView;
- /**
- * 是否显示时间轴Label
- */
- @property (nonatomic, assign) BOOL displayTimestamp;
- /**
- * 1、是否显示Time Line的label
- *
- * @param message 需要配置的目标消息Model
- */
- //- (void)configureTimestamp:(BOOL)displayTimestamp atMessage:(id <DKMessageModel>)message;
- /**
- * 3、配置需要显示什么消息内容,比如语音、文字、视频、图片
- *
- * @param message 需要配置的目标消息Model
- */
- - (void)configureMessageBubbleViewWithMessage:(id <DKMessageModel>)message;
- /**
- * 统一一个方法隐藏MenuController,多处需要调用
- */
- - (void)setupNormalMenuController;
- /**
- * 点击Cell的手势处理方法,用于隐藏MenuController的
- *
- * @param tapGestureRecognizer 点击手势对象
- */
- - (void)tapGestureRecognizerHandle:(UITapGestureRecognizer *)tapGestureRecognizer;
- /**
- * 单击手势处理方法,用于点击多媒体消息触发方法,比如点击语音需要播放的回调、点击图片需要查看大图的回调
- *
- * @param tapGestureRecognizer 点击手势对象
- */
- - (void)sigleTapGestureRecognizerHandle:(UITapGestureRecognizer *)tapGestureRecognizer;
- @end
- @implementation DKUITableViewCell
- - (void)configureCellWithMessage:(id <DKMessageModel>)message
- displaysTimestamp:(BOOL)displayTimestamp {
-
-
- // 4、配置需要显示什么消息内容,比如语音、文字、视频、图片
- [self configureMessageBubbleViewWithMessage:message];
- }
- - (void)configureMessageBubbleViewWithMessage:(id <DKMessageModel>)message {
- DKBubbleMessageMediaType currentMediaType = message.messageMediaType;
- for (UIGestureRecognizer *gesTureRecognizer in self.messageBubbleView.bubbleImageView.gestureRecognizers) {
- [self.messageBubbleView.bubbleImageView removeGestureRecognizer:gesTureRecognizer];
- }
- // for (UIGestureRecognizer *gesTureRecognizer in self.messageBubbleView.bubblePhotoImageView.gestureRecognizers) {
- // [self.messageBubbleView.bubblePhotoImageView removeGestureRecognizer:gesTureRecognizer];
- // }
- switch (currentMediaType) {
- case DKBubbleMessageMediaTypePhoto:
- case DKBubbleMessageMediaTypeVideo:
- case DKBubbleMessageMediaTypeLocalPosition: {
- // UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(sigleTapGestureRecognizerHandle:)];
- // [self.messageBubbleView.bubblePhotoImageView addGestureRecognizer:tapGestureRecognizer];
- break;
- }
- case DKBubbleMessageMediaTypeText:
- case DKBubbleMessageMediaTypeVoice:
- case DKBubbleMessageMediaTypeEmotion: {
- UITapGestureRecognizer *tapGestureRecognizer;
- if (currentMediaType == DKBubbleMessageMediaTypeText) {
- //tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doubleTapGestureRecognizerHandle:)];
- } else {
- tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(sigleTapGestureRecognizerHandle:)];
- }
- tapGestureRecognizer.numberOfTapsRequired = (currentMediaType == DKBubbleMessageMediaTypeText ? 2 : 1);
- [self.messageBubbleView.bubbleImageView addGestureRecognizer:tapGestureRecognizer];
- break;
- }
- default:
- break;
- }
- [self.messageBubbleView configureCellWithMessage:message];
- }
- #pragma mark - Copying Method
- - (BOOL)canBecomeFirstResponder {
- return YES;
- }
- - (BOOL)becomeFirstResponder {
- return [super becomeFirstResponder];
- }
- //- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
- //// return (action == @selector(copyed:) || action == @selector(transpond:) || action == @selector(favorites:) || action == @selector(more:));
- //}
- #pragma mark - Gestures
- - (void)setupNormalMenuController {
- UIMenuController *menu = [UIMenuController sharedMenuController];
- if (menu.isMenuVisible) {
- [menu setMenuVisible:NO animated:YES];
- }
- }
- - (void)tapGestureRecognizerHandle:(UITapGestureRecognizer *)tapGestureRecognizer {
- [self updateMenuControllerVisiable];
- }
- - (void)updateMenuControllerVisiable {
- [self setupNormalMenuController];
- }
- - (void)sigleTapGestureRecognizerHandle:(UITapGestureRecognizer *)tapGestureRecognizer {
- if (tapGestureRecognizer.state == UIGestureRecognizerStateEnded) {
- [self setupNormalMenuController];
- if ([self.delegate respondsToSelector:@selector(multiMediaMessageDidSelectedOnMessage:atIndexPath:onMessageTableViewCell:)]) {
- [self.delegate multiMediaMessageDidSelectedOnMessage:self.messageBubbleView.message atIndexPath:self.indexPath onMessageTableViewCell:self];
- }
- }
- }
- #pragma mark - Notifications
- - (void)handleMenuWillHideNotification:(NSNotification *)notification {
- [[NSNotificationCenter defaultCenter] removeObserver:self
- name:UIMenuControllerWillHideMenuNotification
- object:nil];
- }
- - (void)handleMenuWillShowNotification:(NSNotification *)notification {
- [[NSNotificationCenter defaultCenter] removeObserver:self
- name:UIMenuControllerWillShowMenuNotification
- object:nil];
-
- [[NSNotificationCenter defaultCenter] addObserver:self
- selector:@selector(handleMenuWillHideNotification:)
- name:UIMenuControllerWillHideMenuNotification
- object:nil];
- }
- - (void)dealloc {
- _messageBubbleView = nil;
- _indexPath = nil;
- [[NSNotificationCenter defaultCenter] removeObserver:self];
- }
- - (DKBubbleMessageType)bubbleMessageType {
- return self.messageBubbleView.message.bubbleMessageType;
- }
- + (CGFloat)calculateCellHeightWithMessage:(id <DKMessageModel>)message
- displaysTimestamp:(BOOL)displayTimestamp {
-
- // 第一,是否有时间戳的显示
- CGFloat timestampHeight = displayTimestamp ? (kDKTimeStampLabelHeight + kDKLabelPadding * 2) : 0;
-
- CGFloat userInfoNeedHeight = kDKAvatarPaddingY + (message.shouldShowUserName ? kDKUserNameLabelHeight : 0) + kDKAvatarPaddingY + timestampHeight;
-
- CGFloat bubbleMessageHeight = [DKMessageBubbleView calculateCellHeightWithMessage:message] + timestampHeight;
-
- return MAX(bubbleMessageHeight, userInfoNeedHeight);
- }
- #pragma mark - Life cycle
- - (void)setup {
- self.backgroundColor = [UIColor clearColor];
- self.selectionStyle = UITableViewCellSelectionStyleNone;
- self.accessoryType = UITableViewCellAccessoryNone;
- self.accessoryView = nil;
-
- // UILongPressGestureRecognizer *recognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressGestureRecognizerHandle:)];
- // [recognizer setMinimumPressDuration:0.4f];
- // [self addGestureRecognizer:recognizer];
-
- UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGestureRecognizerHandle:)];
- [self addGestureRecognizer:tapGestureRecognizer];
- }
- - (instancetype)initWithMessage:(id <DKMessageModel>)message
- displaysTimestamp:(BOOL)displayTimestamp
- reuseIdentifier:(NSString *)cellIdentifier {
- self = [self initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
- if (self) {
- // 如果初始化成功,那就根据Message类型进行初始化控件,比如配置头像,配置发送和接收的样式
-
- // 1、是否显示Time Line的label
-
- // 2、配置头像
-
- // 3、配置用户名
-
- // 4、配置需要显示什么消息内容,比如语音、文字、视频、图片
- if (!_messageBubbleView) {
- // bubble container
- DKMessageBubbleView *messageBubbleView = [[DKMessageBubbleView alloc] initWithFrame:CGRectZero message:message];
- [self.contentView addSubview:messageBubbleView];
- [self.contentView sendSubviewToBack:messageBubbleView];
- self.messageBubbleView = messageBubbleView;
- }
- }
- return self;
- }
- - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
- self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
- if (self) {
- // Initialization code
- [self setup];
- }
- return self;
- }
- - (void)awakeFromNib {
- // Initialization code
- [super awakeFromNib];
- [self setup];
- }
- - (void)layoutSubviews {
- [super layoutSubviews];
-
- // // 布局头像
- // CGFloat layoutOriginY = kDKAvatarPaddingY + (self.displayTimestamp ? kDKTimeStampLabelHeight : 0);
-
-
- // 布局用户名
-
-
- // 布局消息内容的View
- CGFloat bubbleX = 0.0f;
- CGFloat offsetX = 0.0f;
- if ([self bubbleMessageType] == DKBubbleMessageTypeReceiving) {
- bubbleX = kDKAvatarPaddingX * 2;
- } else {
- offsetX = kDKAvatarPaddingX * 2;
- }
-
- CGFloat timeStampLabelNeedHeight = (self.displayTimestamp ? (kDKTimeStampLabelHeight + kDKLabelPadding) : 0);
-
- CGRect bubbleMessageViewFrame = CGRectMake(bubbleX,
- timeStampLabelNeedHeight,
- CGRectGetWidth(self.contentView.bounds) - bubbleX - offsetX,
- CGRectGetHeight(self.contentView.bounds) - timeStampLabelNeedHeight);
- self.messageBubbleView.frame = bubbleMessageViewFrame;
- }
- #pragma mark - TableViewCell
- - (void)prepareForReuse {
- // 这里做清除工作
- [super prepareForReuse];
- // self.messageBubbleView.displayTextView.text = nil;
- // self.messageBubbleView.displayTextView.attributedText = nil;
- self.messageBubbleView.bubbleImageView.image = nil;
- //self.messageBubbleView.emotionImageView.animatedImage = nil;
- self.messageBubbleView.animationVoiceImageView.image = nil;
- self.messageBubbleView.voiceDurationLabel.text = nil;
- // self.messageBubbleView.bubblePhotoImageView.messagePhoto = nil;
- //self.messageBubbleView.geolocationsLabel.text = nil;
- }
- @end
|