From 7b02207537d35bfa1714bf8beafc921f717d100a Mon Sep 17 00:00:00 2001
From: 单军华
Date: Wed, 11 Jul 2018 10:47:42 +0800
Subject: [PATCH] 首次上传

---
 screendisplay/Pods/EaseUI/EaseUI/EMUIKit/Views/conversation/MessageCell/EaseMessageCell.m |  883 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 883 insertions(+), 0 deletions(-)

diff --git a/screendisplay/Pods/EaseUI/EaseUI/EMUIKit/Views/conversation/MessageCell/EaseMessageCell.m b/screendisplay/Pods/EaseUI/EaseUI/EMUIKit/Views/conversation/MessageCell/EaseMessageCell.m
new file mode 100755
index 0000000..211eb7a
--- /dev/null
+++ b/screendisplay/Pods/EaseUI/EaseUI/EMUIKit/Views/conversation/MessageCell/EaseMessageCell.m
@@ -0,0 +1,883 @@
+/************************************************************
+ *  * Hyphenate CONFIDENTIAL
+ * __________________
+ * Copyright (C) 2016 Hyphenate Inc. All rights reserved.
+ *
+ * NOTICE: All information contained herein is, and remains
+ * the property of Hyphenate Inc.
+ * Dissemination of this information or reproduction of this material
+ * is strictly forbidden unless prior written permission is obtained
+ * from Hyphenate Inc.
+ */
+
+#import "EaseMessageCell.h"
+
+#import "EaseBubbleView+Text.h"
+#import "EaseBubbleView+Image.h"
+#import "EaseBubbleView+Location.h"
+#import "EaseBubbleView+Voice.h"
+#import "EaseBubbleView+Video.h"
+#import "EaseBubbleView+File.h"
+#import "UIImageView+WebCache.h"
+#import "EaseEmotionEscape.h"
+#import "EaseLocalDefine.h"
+
+CGFloat const EaseMessageCellPadding = 10;
+
+NSString *const EaseMessageCellIdentifierRecvText = @"EaseMessageCellRecvText";
+NSString *const EaseMessageCellIdentifierRecvLocation = @"EaseMessageCellRecvLocation";
+NSString *const EaseMessageCellIdentifierRecvVoice = @"EaseMessageCellRecvVoice";
+NSString *const EaseMessageCellIdentifierRecvVideo = @"EaseMessageCellRecvVideo";
+NSString *const EaseMessageCellIdentifierRecvImage = @"EaseMessageCellRecvImage";
+NSString *const EaseMessageCellIdentifierRecvFile = @"EaseMessageCellRecvFile";
+
+NSString *const EaseMessageCellIdentifierSendText = @"EaseMessageCellSendText";
+NSString *const EaseMessageCellIdentifierSendLocation = @"EaseMessageCellSendLocation";
+NSString *const EaseMessageCellIdentifierSendVoice = @"EaseMessageCellSendVoice";
+NSString *const EaseMessageCellIdentifierSendVideo = @"EaseMessageCellSendVideo";
+NSString *const EaseMessageCellIdentifierSendImage = @"EaseMessageCellSendImage";
+NSString *const EaseMessageCellIdentifierSendFile = @"EaseMessageCellSendFile";
+
+@interface EaseMessageCell()
+{
+    EMMessageBodyType _messageType;
+}
+
+@property (nonatomic) NSLayoutConstraint *statusWidthConstraint;
+@property (nonatomic) NSLayoutConstraint *activtiyWidthConstraint;
+@property (nonatomic) NSLayoutConstraint *hasReadWidthConstraint;
+@property (nonatomic) NSLayoutConstraint *bubbleMaxWidthConstraint;
+
+@end
+
+@implementation EaseMessageCell
+
+@synthesize statusButton = _statusButton;
+@synthesize bubbleView = _bubbleView;
+@synthesize hasRead = _hasRead;
+@synthesize activity = _activity;
+
++ (void)initialize
+{
+    // UIAppearance Proxy Defaults
+    EaseMessageCell *cell = [self appearance];
+    cell.statusSize = 20;
+    cell.activitySize = 20;
+    cell.bubbleMaxWidth = 200;
+    cell.leftBubbleMargin = UIEdgeInsetsMake(8, 15, 8, 10);
+    cell.rightBubbleMargin = UIEdgeInsetsMake(8, 10, 8, 15);
+    cell.bubbleMargin = UIEdgeInsetsMake(8, 0, 8, 0);
+    
+    cell.messageTextFont = [UIFont systemFontOfSize:15];
+    cell.messageTextColor = [UIColor blackColor];
+    
+    cell.messageLocationFont = [UIFont systemFontOfSize:10];
+    cell.messageLocationColor = [UIColor whiteColor];
+    
+    cell.messageVoiceDurationColor = [UIColor grayColor];
+    cell.messageVoiceDurationFont = [UIFont systemFontOfSize:12];
+    cell.voiceCellWidth = 75.f;
+    
+    cell.messageFileNameColor = [UIColor blackColor];
+    cell.messageFileNameFont = [UIFont systemFontOfSize:13];
+    cell.messageFileSizeColor = [UIColor grayColor];
+    cell.messageFileSizeFont = [UIFont systemFontOfSize:11];
+}
+
+- (instancetype)initWithStyle:(UITableViewCellStyle)style
+              reuseIdentifier:(NSString *)reuseIdentifier
+                        model:(id<IMessageModel>)model
+{
+    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
+    if (self) {
+        self.accessibilityIdentifier = @"table_cell";
+
+        _messageType = model.bodyType;
+        [self _setupSubviewsWithType:_messageType
+                            isSender:model.isSender
+                               model:model];
+    }
+    
+    return self;
+}
+
+- (BOOL)canBecomeFirstResponder
+{
+    return YES;
+}
+
+#pragma mark - setup subviews
+
+/*!
+ @method
+ @brief ���������������
+ @discussion  
+ @param messageType  ���������������
+ @param isSender     ������������������������������
+ @param model        ������������model
+ @result
+ */
+- (void)_setupSubviewsWithType:(EMMessageBodyType)messageType
+                      isSender:(BOOL)isSender
+                         model:(id<IMessageModel>)model
+{
+    _statusButton = [[UIButton alloc] init];
+    _statusButton.accessibilityIdentifier = @"status";
+    _statusButton.translatesAutoresizingMaskIntoConstraints = NO;
+    _statusButton.imageView.contentMode = UIViewContentModeScaleAspectFit;
+    [_statusButton setImage:[UIImage easeImageNamed:@"EaseUIResource.bundle/messageSendFail"] forState:UIControlStateNormal];
+    [_statusButton addTarget:self action:@selector(statusAction) forControlEvents:UIControlEventTouchUpInside];
+    _statusButton.hidden = YES;
+    [self.contentView addSubview:_statusButton];
+    
+    _bubbleView = [[EaseBubbleView alloc] initWithMargin:isSender?_rightBubbleMargin:_leftBubbleMargin isSender:isSender];
+    _bubbleView.translatesAutoresizingMaskIntoConstraints = NO;
+    _bubbleView.backgroundColor = [UIColor clearColor];
+    [self.contentView addSubview:_bubbleView];
+    
+    _avatarView = [[UIImageView alloc] init];
+    _avatarView.translatesAutoresizingMaskIntoConstraints = NO;
+    _avatarView.backgroundColor = [UIColor clearColor];
+    _avatarView.clipsToBounds = YES;
+    _avatarView.userInteractionEnabled = YES;
+    [self.contentView addSubview:_avatarView];
+    
+    _hasRead = [[UILabel alloc] init];
+    _hasRead.accessibilityIdentifier = @"has_read";
+    _hasRead.translatesAutoresizingMaskIntoConstraints = NO;
+    _hasRead.text = NSEaseLocalizedString(@"hasRead", @"Read");
+    _hasRead.textAlignment = NSTextAlignmentCenter;
+    _hasRead.font = [UIFont systemFontOfSize:12];
+    _hasRead.hidden = YES;
+    [_hasRead sizeToFit];
+    [self.contentView addSubview:_hasRead];
+    
+    _activity = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
+    _activity.accessibilityIdentifier = @"sending";
+    _activity.translatesAutoresizingMaskIntoConstraints = NO;
+    _activity.backgroundColor = [UIColor clearColor];
+    _activity.hidden = YES;
+    [self.contentView addSubview:_activity];
+    
+    if ([self respondsToSelector:@selector(isCustomBubbleView:)] && [self isCustomBubbleView:model]) {
+        [self setCustomBubbleView:model];
+    } else {
+        switch (messageType) {
+            case EMMessageBodyTypeText:
+            {
+                [_bubbleView setupTextBubbleView];
+                
+                _bubbleView.textLabel.font = _messageTextFont;
+                _bubbleView.textLabel.textColor = _messageTextColor;
+            }
+                break;
+            case EMMessageBodyTypeImage:
+            {
+                [_bubbleView setupImageBubbleView];
+                
+                _bubbleView.imageView.image = [UIImage easeImageNamed:@"EaseUIResource.bundle/imageDownloadFail"];
+            }
+                break;
+            case EMMessageBodyTypeLocation:
+            {
+                [_bubbleView setupLocationBubbleView];
+                
+                _bubbleView.locationImageView.image = [[UIImage easeImageNamed:@"EaseUIResource.bundle/chat_location_preview"] stretchableImageWithLeftCapWidth:10 topCapHeight:10];
+                _bubbleView.locationLabel.font = _messageLocationFont;
+                _bubbleView.locationLabel.textColor = _messageLocationColor;
+            }
+                break;
+            case EMMessageBodyTypeVoice:
+            {
+                [_bubbleView setupVoiceBubbleView];
+                
+                _bubbleView.voiceDurationLabel.textColor = _messageVoiceDurationColor;
+                _bubbleView.voiceDurationLabel.font = _messageVoiceDurationFont;
+            }
+                break;
+            case EMMessageBodyTypeVideo:
+            {
+                [_bubbleView setupVideoBubbleView];
+                
+                _bubbleView.videoTagView.image = [UIImage easeImageNamed:@"EaseUIResource.bundle/messageVideo"];
+            }
+                break;
+            case EMMessageBodyTypeFile:
+            {
+                [_bubbleView setupFileBubbleView];
+                
+                _bubbleView.fileNameLabel.font = _messageFileNameFont;
+                _bubbleView.fileNameLabel.textColor = _messageFileNameColor;
+                _bubbleView.fileSizeLabel.font = _messageFileSizeFont;
+            }
+                break;
+            default:
+                break;
+        }
+    }
+    
+    [self _setupConstraints];
+    
+    UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(bubbleViewTapAction:)];
+    [_bubbleView addGestureRecognizer:tapRecognizer];
+    
+    UITapGestureRecognizer *tapRecognizer2 = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(avatarViewTapAction:)];
+    [_avatarView addGestureRecognizer:tapRecognizer2];
+}
+
+#pragma mark - Setup Constraints
+
+/*!
+ @method
+ @brief ������������������
+ @discussion  ���������������������������������������������������������
+ @result
+ */
+- (void)_setupConstraints
+{
+    //bubble view
+    [self addConstraint:[NSLayoutConstraint constraintWithItem:self.bubbleView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.contentView attribute:NSLayoutAttributeBottom multiplier:1.0 constant:-EaseMessageCellPadding]];
+    
+    self.bubbleMaxWidthConstraint = [NSLayoutConstraint constraintWithItem:self.bubbleView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationLessThanOrEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:self.bubbleMaxWidth];
+    [self addConstraint:self.bubbleMaxWidthConstraint];
+//    self.bubbleMaxWidthConstraint.active = YES;
+    
+    //status button
+    self.statusWidthConstraint = [NSLayoutConstraint constraintWithItem:self.statusButton attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:self.statusSize];
+    [self addConstraint:self.statusWidthConstraint];
+    [self addConstraint:[NSLayoutConstraint constraintWithItem:self.statusButton attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:self.statusButton attribute:NSLayoutAttributeWidth multiplier:1.0 constant:0]];
+    [self addConstraint:[NSLayoutConstraint constraintWithItem:self.statusButton attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self.contentView attribute:NSLayoutAttributeCenterY multiplier:1.0 constant:0]];
+    
+    //activtiy
+    self.activtiyWidthConstraint = [NSLayoutConstraint constraintWithItem:self.activity attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:self.activitySize];
+    [self addConstraint:self.activtiyWidthConstraint];
+    [self addConstraint:[NSLayoutConstraint constraintWithItem:self.activity attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:self.activity attribute:NSLayoutAttributeWidth multiplier:1.0 constant:0]];
+    [self addConstraint:[NSLayoutConstraint constraintWithItem:self.activity attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self.contentView attribute:NSLayoutAttributeCenterY multiplier:1.0 constant:0]];
+    
+    [self _updateHasReadWidthConstraint];
+    [self addConstraint:[NSLayoutConstraint constraintWithItem:self.hasRead attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self.contentView attribute:NSLayoutAttributeCenterY multiplier:1.0 constant:0]];
+    [self addConstraint:[NSLayoutConstraint constraintWithItem:self.hasRead attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:self.statusButton attribute:NSLayoutAttributeWidth multiplier:1.0 constant:0]];
+//    [self addConstraint:[NSLayoutConstraint constraintWithItem:self.hasRead attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:self.activity attribute:NSLayoutAttributeWidth multiplier:1.0 constant:0]];
+}
+
+#pragma mark - Update Constraint
+
+/*!
+ @method
+ @brief ������������Label���������������
+ @discussion
+ @result
+ */
+- (void)_updateHasReadWidthConstraint
+{
+    if (_hasRead) {
+        [self removeConstraint:self.hasReadWidthConstraint];
+        
+        self.hasReadWidthConstraint = [NSLayoutConstraint constraintWithItem:_hasRead attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:0 constant:40];
+        [self addConstraint:self.hasReadWidthConstraint];
+    }
+}
+
+/*!
+ @method
+ @brief ������������������������������������������������������������������������
+ @discussion
+ @result
+ */
+- (void)_updateStatusButtonWidthConstraint
+{
+    if (_statusButton) {
+        [self removeConstraint:self.statusWidthConstraint];
+        
+        self.statusWidthConstraint = [NSLayoutConstraint constraintWithItem:self.statusButton attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:0 constant:self.statusSize];
+        [self addConstraint:self.statusWidthConstraint];
+    }
+}
+
+/*!
+ @method
+ @brief ���������������������������������
+ @discussion
+ @result
+ */
+- (void)_updateActivityWidthConstraint
+{
+    if (_activity) {
+        [self removeConstraint:self.activtiyWidthConstraint];
+        
+        self.statusWidthConstraint = [NSLayoutConstraint constraintWithItem:self.activity attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:0 constant:self.activitySize];
+        [self addConstraint:self.activtiyWidthConstraint];
+    }
+}
+
+/*!
+ @method
+ @brief ���������������������������
+ @discussion
+ @result
+ */
+- (void)_updateBubbleMaxWidthConstraint
+{
+    [self removeConstraint:self.bubbleMaxWidthConstraint];
+//    self.bubbleMaxWidthConstraint.active = NO;
+    
+    //������������������������bubbleMaxWidth
+    self.bubbleMaxWidthConstraint = [NSLayoutConstraint constraintWithItem:self.bubbleView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationLessThanOrEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:self.bubbleMaxWidth];
+    [self addConstraint:self.bubbleMaxWidthConstraint];
+//    self.bubbleMaxWidthConstraint.active = YES;
+}
+
+#pragma mark - setter
+
+- (void)setModel:(id<IMessageModel>)model
+{
+    _model = model;
+    if ([self respondsToSelector:@selector(isCustomBubbleView:)] && [self isCustomBubbleView:model]) {
+        [self setCustomModel:model];
+    } else {
+        switch (model.bodyType) {
+            case EMMessageBodyTypeText:
+            {
+                _bubbleView.textLabel.attributedText = [[EaseEmotionEscape sharedInstance] attStringFromTextForChatting:model.text textFont:self.messageTextFont];
+            }
+                break;
+            case EMMessageBodyTypeImage:
+            {
+                UIImage *image = _model.thumbnailImage;
+                if (!image) {
+                    image = _model.image;
+                    if (!image) {
+                        [_bubbleView.imageView sd_setImageWithURL:[NSURL URLWithString:_model.thumbnailFileURLPath] placeholderImage:[UIImage imageNamed:_model.failImageName]];
+                    } else {
+                        _bubbleView.imageView.image = image;
+                    }
+                } else {
+                    _bubbleView.imageView.image = image;
+                }
+            }
+                break;
+            case EMMessageBodyTypeLocation:
+            {
+                _bubbleView.locationLabel.text = _model.address;
+            }
+                break;
+            case EMMessageBodyTypeVoice:
+            {
+                if (_bubbleView.voiceImageView) {
+                    if ([self.sendMessageVoiceAnimationImages count] > 0 && [self.recvMessageVoiceAnimationImages count] > 0) {
+                        self.bubbleView.voiceImageView.image = self.model.isSender ?[self.sendMessageVoiceAnimationImages objectAtIndex:0] : [self.recvMessageVoiceAnimationImages objectAtIndex:0];
+                        _bubbleView.voiceImageView.animationImages = self.model.isSender ? self.sendMessageVoiceAnimationImages:self.recvMessageVoiceAnimationImages;
+                    } else {
+                        self.bubbleView.voiceImageView.image = self.model.isSender ?[UIImage easeImageNamed:@"EaseUIResource.bundle/chat_sender_audio_playing_full"]: [UIImage easeImageNamed:@"EaseUIResource.bundle/chat_receiver_audio_playing_full"];
+                    }
+                }
+                if (!self.model.isSender) {
+                    if (self.model.isMediaPlayed){
+                        _bubbleView.isReadView.hidden = YES;
+                    } else {
+                        _bubbleView.isReadView.hidden = NO;
+                    }
+                }
+                
+                if (_model.isMediaPlaying) {
+                    [_bubbleView.voiceImageView startAnimating];
+                }
+                else{
+                    [_bubbleView.voiceImageView stopAnimating];
+                }
+                
+                _bubbleView.voiceDurationLabel.text = [NSString stringWithFormat:@"%d''",(int)_model.mediaDuration];
+            }
+                break;
+            case EMMessageBodyTypeVideo:
+            {
+                UIImage *image = _model.isSender ? _model.image : _model.thumbnailImage;
+                if (!image) {
+                    image = _model.image;
+                    if (!image) {
+                        [_bubbleView.videoImageView sd_setImageWithURL:[NSURL URLWithString:_model.fileURLPath] placeholderImage:[UIImage imageNamed:_model.failImageName]];
+                    } else {
+                        _bubbleView.videoImageView.image = image;
+                    }
+                } else {
+                    _bubbleView.videoImageView.image = image;
+                }
+            }
+                break;
+            case EMMessageBodyTypeFile:
+            {
+                _bubbleView.fileIconView.image = [UIImage imageNamed:_model.fileIconName];
+                _bubbleView.fileNameLabel.text = _model.fileName;
+                _bubbleView.fileSizeLabel.text = _model.fileSizeDes;
+            }
+                break;
+            default:
+                break;
+        }
+    }
+}
+
+- (void)setStatusSize:(CGFloat)statusSize
+{
+    _statusSize = statusSize;
+    [self _updateStatusButtonWidthConstraint];
+}
+
+- (void)setActivitySize:(CGFloat)activitySize
+{
+    _activitySize = activitySize;
+    [self _updateActivityWidthConstraint];
+}
+
+- (void)setSendBubbleBackgroundImage:(UIImage *)sendBubbleBackgroundImage
+{
+    _sendBubbleBackgroundImage = sendBubbleBackgroundImage;
+}
+
+- (void)setRecvBubbleBackgroundImage:(UIImage *)recvBubbleBackgroundImage
+{
+    _recvBubbleBackgroundImage = recvBubbleBackgroundImage;
+}
+
+- (void)setBubbleMaxWidth:(CGFloat)bubbleMaxWidth
+{
+    _bubbleMaxWidth = bubbleMaxWidth;
+    [self _updateBubbleMaxWidthConstraint];
+}
+
+- (void)setRightBubbleMargin:(UIEdgeInsets)rightBubbleMargin
+{
+    _rightBubbleMargin = rightBubbleMargin;
+}
+
+- (void)setLeftBubbleMargin:(UIEdgeInsets)leftBubbleMargin
+{
+    _leftBubbleMargin = leftBubbleMargin;
+}
+
+- (void)setBubbleMargin:(UIEdgeInsets)bubbleMargin
+{
+    _bubbleMargin = bubbleMargin;
+    _bubbleMargin = self.model.isSender ? _rightBubbleMargin:_leftBubbleMargin;
+    if ([self respondsToSelector:@selector(isCustomBubbleView:)] && [self isCustomBubbleView:_model]) {
+        [self updateCustomBubbleViewMargin:_bubbleMargin model:_model];
+    } else {
+        if (_bubbleView) {
+            switch (_messageType) {
+                case EMMessageBodyTypeText:
+                {
+                    [_bubbleView updateTextMargin:_bubbleMargin];
+                }
+                    break;
+                case EMMessageBodyTypeImage:
+                {
+                    [_bubbleView updateImageMargin:_bubbleMargin];
+                }
+                    break;
+                case EMMessageBodyTypeLocation:
+                {
+                    [_bubbleView updateLocationMargin:_bubbleMargin];
+                }
+                    break;
+                case EMMessageBodyTypeVoice:
+                {
+                    [_bubbleView updateVoiceMargin:_bubbleMargin];
+                }
+                    break;
+                case EMMessageBodyTypeVideo:
+                {
+                    [_bubbleView updateVideoMargin:_bubbleMargin];
+                }
+                    break;
+                case EMMessageBodyTypeFile:
+                {
+                    [_bubbleView updateFileMargin:_bubbleMargin];
+                }
+                    break;
+                default:
+                    break;
+            }
+            
+        }
+    }
+}
+
+- (void)setMessageTextFont:(UIFont *)messageTextFont
+{
+    _messageTextFont = messageTextFont;
+    if (_bubbleView.textLabel) {
+        _bubbleView.textLabel.font = messageTextFont;
+    }
+}
+
+- (void)setMessageTextColor:(UIColor *)messageTextColor
+{
+    _messageTextColor = messageTextColor;
+    if (_bubbleView.textLabel) {
+        _bubbleView.textLabel.textColor = _messageTextColor;
+    }
+}
+
+- (void)setMessageLocationColor:(UIColor *)messageLocationColor
+{
+    _messageLocationColor = messageLocationColor;
+    if (_bubbleView.locationLabel) {
+        _bubbleView.locationLabel.textColor = _messageLocationColor;
+    }
+}
+
+- (void)setMessageLocationFont:(UIFont *)messageLocationFont
+{
+    _messageLocationFont = messageLocationFont;
+    if (_bubbleView.locationLabel) {
+        _bubbleView.locationLabel.font = _messageLocationFont;
+    }
+}
+
+- (void)setSendMessageVoiceAnimationImages:(NSArray *)sendMessageVoiceAnimationImages
+{
+    _sendMessageVoiceAnimationImages = sendMessageVoiceAnimationImages;
+}
+
+- (void)setRecvMessageVoiceAnimationImages:(NSArray *)recvMessageVoiceAnimationImages
+{
+    _recvMessageVoiceAnimationImages = recvMessageVoiceAnimationImages;
+}
+
+- (void)setMessageVoiceDurationColor:(UIColor *)messageVoiceDurationColor
+{
+    _messageVoiceDurationColor = messageVoiceDurationColor;
+    if (_bubbleView.voiceDurationLabel) {
+        _bubbleView.voiceDurationLabel.textColor = _messageVoiceDurationColor;
+    }
+}
+
+- (void)setMessageVoiceDurationFont:(UIFont *)messageVoiceDurationFont
+{
+    _messageVoiceDurationFont = messageVoiceDurationFont;
+    if (_bubbleView.voiceDurationLabel) {
+        _bubbleView.voiceDurationLabel.font = _messageVoiceDurationFont;
+    }
+}
+
+- (void)setMessageFileNameFont:(UIFont *)messageFileNameFont
+{
+    _messageFileNameFont = messageFileNameFont;
+    if (_bubbleView.fileNameLabel) {
+        _bubbleView.fileNameLabel.font = _messageFileNameFont;
+    }
+}
+
+- (void)setMessageFileNameColor:(UIColor *)messageFileNameColor
+{
+    _messageFileNameColor = messageFileNameColor;
+    if (_bubbleView.fileNameLabel) {
+        _bubbleView.fileNameLabel.textColor = _messageFileNameColor;
+    }
+}
+
+- (void)setMessageFileSizeFont:(UIFont *)messageFileSizeFont
+{
+    _messageFileSizeFont = messageFileSizeFont;
+    if (_bubbleView.fileSizeLabel) {
+        _bubbleView.fileSizeLabel.font = _messageFileSizeFont;
+    }
+}
+
+- (void)setMessageFileSizeColor:(UIColor *)messageFileSizeColor
+{
+    _messageFileSizeColor = messageFileSizeColor;
+    if (_bubbleView.fileSizeLabel) {
+        _bubbleView.fileSizeLabel.textColor = _messageFileSizeColor;
+    }
+}
+
+#pragma mark - action
+
+/*!
+ @method
+ @brief ���������������������������
+ @discussion
+ @result
+ */
+- (void)bubbleViewTapAction:(UITapGestureRecognizer *)tapRecognizer
+{
+    if (tapRecognizer.state == UIGestureRecognizerStateEnded) {
+        if (!_delegate) {
+            return;
+        }
+        
+        if ([self respondsToSelector:@selector(isCustomBubbleView:)] && [self isCustomBubbleView:_model]) {
+            if ([_delegate respondsToSelector:@selector(messageCellSelected:)]) {
+                [_delegate messageCellSelected:_model];
+                return;
+            }
+        }
+        switch (_model.bodyType) {
+            case EMMessageBodyTypeImage:
+            {
+                if ([_delegate respondsToSelector:@selector(messageCellSelected:)]) {
+                    [_delegate messageCellSelected:_model];
+                }
+            }
+                break;
+            case EMMessageBodyTypeLocation:
+            {
+                if ([_delegate respondsToSelector:@selector(messageCellSelected:)]) {
+                    [_delegate messageCellSelected:_model];
+                }
+            }
+                break;
+            case EMMessageBodyTypeVoice:
+            {
+//                _model.isMediaPlaying = !_model.isMediaPlaying;
+//                if (_model.isMediaPlaying) {
+//                    [_bubbleView.voiceImageView startAnimating];
+//                }
+//                else{
+//                    [_bubbleView.voiceImageView stopAnimating];
+//                }
+                if ([_delegate respondsToSelector:@selector(messageCellSelected:)]) {
+                    [_delegate messageCellSelected:_model];
+                }
+            }
+                break;
+            case EMMessageBodyTypeVideo:
+            {
+                if ([_delegate respondsToSelector:@selector(messageCellSelected:)]) {
+                    [_delegate messageCellSelected:_model];
+                }
+            }
+                break;
+            case EMMessageBodyTypeFile:
+            {
+                if ([_delegate respondsToSelector:@selector(messageCellSelected:)]) {
+                    [_delegate messageCellSelected:_model];
+                }
+            }
+                break;
+            default:
+                break;
+        }
+    }
+}
+
+/*!
+ @method
+ @brief ���������������������
+ @discussion
+ @result
+ */
+- (void)avatarViewTapAction:(UITapGestureRecognizer *)tapRecognizer
+{
+    if ([_delegate respondsToSelector:@selector(avatarViewSelcted:)]) {
+        [_delegate avatarViewSelcted:_model];
+    }
+}
+
+/*!
+ @method
+ @brief ������������������������������������������������������
+ @discussion
+ @result
+ */
+- (void)statusAction
+{
+    if ([_delegate respondsToSelector:@selector(statusButtonSelcted:withMessageCell:)]) {
+        [_delegate statusButtonSelcted:_model withMessageCell:self];
+    }
+}
+
+#pragma mark - IModelCell
+/*
+- (BOOL)isCustomBubbleView:(id<IMessageModel>)model
+{
+    return NO;
+}
+
+- (void)setCustomModel:(id<IMessageModel>)model
+{
+
+}
+
+- (void)setCustomBubbleView:(id<IMessageModel>)model
+{
+
+}
+
+- (void)updateCustomBubbleViewMargin:(UIEdgeInsets)bubbleMargin model:(id<IMessageModel>)model
+{
+
+}*/
+
+#pragma mark - public
+
+/*!
+ @method
+ @brief ������cell���������������
+ @discussion
+ @param model        ������������model
+ @result ������cell���������������
+ */
++ (NSString *)cellIdentifierWithModel:(id<IMessageModel>)model
+{
+    NSString *cellIdentifier = nil;
+    if (model.isSender) {
+        switch (model.bodyType) {
+            case EMMessageBodyTypeText:
+                cellIdentifier = EaseMessageCellIdentifierSendText;
+                break;
+            case EMMessageBodyTypeImage:
+                cellIdentifier = EaseMessageCellIdentifierSendImage;
+                break;
+            case EMMessageBodyTypeVideo:
+                cellIdentifier = EaseMessageCellIdentifierSendVideo;
+                break;
+            case EMMessageBodyTypeLocation:
+                cellIdentifier = EaseMessageCellIdentifierSendLocation;
+                break;
+            case EMMessageBodyTypeVoice:
+                cellIdentifier = EaseMessageCellIdentifierSendVoice;
+                break;
+            case EMMessageBodyTypeFile:
+                cellIdentifier = EaseMessageCellIdentifierSendFile;
+                break;
+            default:
+                break;
+        }
+    }
+    else{
+        switch (model.bodyType) {
+            case EMMessageBodyTypeText:
+                cellIdentifier = EaseMessageCellIdentifierRecvText;
+                break;
+            case EMMessageBodyTypeImage:
+                cellIdentifier = EaseMessageCellIdentifierRecvImage;
+                break;
+            case EMMessageBodyTypeVideo:
+                cellIdentifier = EaseMessageCellIdentifierRecvVideo;
+                break;
+            case EMMessageBodyTypeLocation:
+                cellIdentifier = EaseMessageCellIdentifierRecvLocation;
+                break;
+            case EMMessageBodyTypeVoice:
+                cellIdentifier = EaseMessageCellIdentifierRecvVoice;
+                break;
+            case EMMessageBodyTypeFile:
+                cellIdentifier = EaseMessageCellIdentifierRecvFile;
+                break;
+            default:
+                break;
+        }
+    }
+    
+    return cellIdentifier;
+}
+
+/*!
+ @method
+ @brief ������������������������������������cell���������
+ @discussion
+ @param model        ������������model
+ @result ������cell������
+ */
++ (CGFloat)cellHeightWithModel:(id<IMessageModel>)model
+{
+    if (model.cellHeight > 0) {
+        return model.cellHeight;
+    }
+    
+    EaseMessageCell *cell = [self appearance];
+    CGFloat bubbleMaxWidth = cell.bubbleMaxWidth;
+    if ([UIDevice currentDevice].systemVersion.floatValue == 7.0) {
+        bubbleMaxWidth = 200;
+    }
+    bubbleMaxWidth -= (cell.leftBubbleMargin.left + cell.leftBubbleMargin.right + cell.rightBubbleMargin.left + cell.rightBubbleMargin.right)/2;
+    
+    CGFloat height = EaseMessageCellPadding + cell.bubbleMargin.top + cell.bubbleMargin.bottom;
+    
+    switch (model.bodyType) {
+        case EMMessageBodyTypeText:
+        {
+            NSAttributedString *text = [[EaseEmotionEscape sharedInstance] attStringFromTextForChatting:model.text textFont:cell.messageTextFont];
+            CGRect rect = [text boundingRectWithSize:CGSizeMake(bubbleMaxWidth, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading context:nil];
+            height += (rect.size.height > 20 ? rect.size.height : 20) + 10;
+//            NSString *text = model.text;
+//            UIFont *textFont = cell.messageTextFont;
+//            CGSize retSize;
+//            if ([NSString instancesRespondToSelector:@selector(boundingRectWithSize:options:attributes:context:)]) {
+//                retSize = [text boundingRectWithSize:CGSizeMake(bubbleMaxWidth, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:textFont} context:nil].size;
+//            }else{
+//                retSize = [text sizeWithFont:textFont constrainedToSize:CGSizeMake(bubbleMaxWidth, CGFLOAT_MAX) lineBreakMode:NSLineBreakByCharWrapping];
+//            }
+//            
+//            
+//            height += (retSize.height > 20 ? retSize.height : 20) + 10;
+        }
+            break;
+        case EMMessageBodyTypeImage:
+        case EMMessageBodyTypeVideo:
+        {
+            CGSize retSize = model.thumbnailImageSize;
+            if (retSize.width == 0 || retSize.height == 0) {
+                retSize.width = kEMMessageImageSizeWidth;
+                retSize.height = kEMMessageImageSizeHeight;
+            }
+            else if (retSize.width > retSize.height) {
+                CGFloat height =  kEMMessageImageSizeWidth / retSize.width * retSize.height;
+                retSize.height = height;
+                retSize.width = kEMMessageImageSizeWidth;
+            }
+            else {
+                CGFloat width = kEMMessageImageSizeHeight / retSize.height * retSize.width;
+                retSize.width = width;
+                retSize.height = kEMMessageImageSizeHeight;
+            }
+
+            height += retSize.height;
+        }
+            break;
+        case EMMessageBodyTypeLocation:
+        {
+            height += kEMMessageLocationHeight;
+        }
+            break;
+        case EMMessageBodyTypeVoice:
+        {
+            height += kEMMessageVoiceHeight;
+        }
+            break;
+        case EMMessageBodyTypeFile:
+        {
+            NSString *text = model.fileName;
+            UIFont *font = cell.messageFileNameFont;
+            CGRect nameRect;
+            if ([NSString instancesRespondToSelector:@selector(boundingRectWithSize:options:attributes:context:)]) {
+                nameRect = [text boundingRectWithSize:CGSizeMake(bubbleMaxWidth, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:font} context:nil];
+            } else {
+                nameRect.size = [text sizeWithFont:font constrainedToSize:CGSizeMake(bubbleMaxWidth, CGFLOAT_MAX) lineBreakMode:NSLineBreakByCharWrapping];
+            }
+            height += (nameRect.size.height > 20 ? nameRect.size.height : 20);
+            
+            text = model.fileSizeDes;
+            font = cell.messageFileSizeFont;
+            CGRect sizeRect;
+            if ([NSString instancesRespondToSelector:@selector(boundingRectWithSize:options:attributes:context:)]) {
+                sizeRect = [text boundingRectWithSize:CGSizeMake(bubbleMaxWidth, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:font} context:nil];
+            } else {
+                sizeRect.size = [text sizeWithFont:font constrainedToSize:CGSizeMake(bubbleMaxWidth, CGFLOAT_MAX) lineBreakMode:NSLineBreakByCharWrapping];
+            }
+            height += (sizeRect.size.height > 15 ? sizeRect.size.height : 15);
+        }
+            break;
+        default:
+            break;
+    }
+
+    height += EaseMessageCellPadding;
+    model.cellHeight = height;
+    
+    return height;
+}
+
+@end

--
Gitblit v1.8.0