转载地址: [简书地址](http://www.jianshu.com/users/23d0ae412e19/latest_articles)
/**
* @author 麦子, 16-08-15 16:08:05
*
*
图片的处理。 如果是GIF的话,用的是第三方的,我们这边不做处理。 如果是静态图片的话,重新设置Frame的参数。
然后就是调整Cell的高度问题。
网络图片也是一样。 对于图片的规格的话, 都是以最大的为主, 然后其他的会相应的缩小比列。 控制比列的大小。同时也设置了一个最大的宽度和高度。
*/
@interface BubblePhotoView()
@property (nonatomic,strong) FLAnimatedImageView *imageV;
@end
@implementation BubblePhotoView
+ (instancetype)BubblePhotoView
{
BubblePhotoView *bubbleView = [[self alloc]init];
return bubbleView;
}
- (instancetype)initWithFrame:(CGRect)frame{
self = [super initWithFrame:frame];
if (self) {
_imageV = [[FLAnimatedImageView alloc]initWithFrame:self.bounds];
_imageV.contentMode = UIViewContentModeScaleAspectFill;
_imageV.layer.cornerRadius = 6;
_imageV.layer.masksToBounds = true;
[self addSubview:_imageV];
self.backgroundColor = [UIColor clearColor];
}
return self;
}
- (void)setMessage:(TalkMessage *)message{
_message = message;
if (message.isSend) { // 发送
if (message.isGif) { //如果是动态图片
FLAnimatedImage *animationImage = [FLAnimatedImage animatedImageWithGIFData:[NSData dataWithContentsOfFile:_message.photoAddress]];
_imageV.animatedImage = animationImage;
}else{
_imageV.image = [UIImage imageWithContentsOfFile:_message.photoAddress];
}
// 重画处理
[self setNeedsDisplay];
}else{ // 收取网络图片
UIImage *placeholderImage = [UIImage imageNamed:@"placeholderImage"];
[_imageV sd_setImageWithURL:[NSURL URLWithString:@"http://img.hb.aicdn.com/b617afdf7a972b26c438293c762c9f50b7eed0b6146a5-6bQadP_fw580"] placeholderImage:placeholderImage completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
[self setNeedsDisplay];
}];
}
}
#define KMargin 5
- (void)layoutSubviews{
[super layoutSubviews];
if (_message.isGif) {
_imageV.frame = self.bounds;
}else{
_imageV.frame = CGRectMake(KMargin, KMargin, self.frame.size.width-2*KMargin, self.frame.size.height-2*KMargin);
}
}
- (void)drawRect:(CGRect)rect{
if (!_message.isGif) { // 不是GIF就进行画气泡, GIF不在自己代码这边控制。
[UIImage drawImage:_imageV.image atFrame:rect isSender:_message.flag];
}
}
// 改变图片处理方式:微信方式:长>宽 ,图片长为固定最大长度,宽按比例缩放,长<宽,图片宽为最大宽度,长按比例缩放
#define KBubbleImageMaxWidth 145
#define KBubbleImageMaxHeight 145
+ (CGSize)photoWithSize:(TalkMessage *)message{
CGSize imageSize = message.size;
if (imageSize.width == 0 || imageSize.height == 0) {
if (message.localPhotoFlag){ // 表示本地图片
UIImage *photo = [UIImage imageWithContentsOfFile:message.photoAddress];
imageSize = photo.size;
if (imageSize.width>imageSize.height){
imageSize.height *= KBubbleImageMaxWidth/imageSize.width;
imageSize.width = KBubbleImageMaxWidth;
}else{
imageSize.width *= KBubbleImageMaxHeight/imageSize.height;
imageSize.height = KBubbleImageMaxHeight;
}
}else{ //正常接口不会走这步,demo使用网络图片才会走这步
imageSize.width = KBubbleImageMaxWidth;
imageSize.height = KBubbleImageMaxHeight;
}
}else{
//返回服务器图片尺寸
if (imageSize.width>imageSize.height){
imageSize.height *= KBubbleImageMaxWidth/imageSize.width;
imageSize.width = KBubbleImageMaxWidth;
}else{
imageSize.width *= KBubbleImageMaxHeight/imageSize.height;
imageSize.height = KBubbleImageMaxHeight;
}
}
return imageSize;
}
@end
case MessageBubbleTypePhoto:{ // 显示图片
BubblePhotoView *photoView = [BubblePhotoView BubblePhotoView];
photoView.message = message;
[self.bubbleImageV addSubview:photoView];
CGSize size = [BubblePhotoView photoWithSize:message];
//注意self.bubbleImageV是在内部bubble的size.width上增加间距定的frame
if (_message.flag) {
self.bubbleImageV.frame = CGRectMake(CGRectGetMinX(self.avateImageV.frame)-(size.width+KSenderLeftBubbleImageMargin+KSenderRightBubbleImageMargin),KTopBubbleImageMargin,size.width+KSenderLeftBubbleImageMargin+KSenderRightBubbleImageMargin,size.height+2*KTopBubbleImageMargin);
photoView.frame = CGRectMake(KSenderLeftBubbleImageMargin,KTopBubbleImageMargin, size.width, size.height);
}else{
self.bubbleImageV.frame = CGRectMake(CGRectGetMaxX(self.avateImageV.frame),KTopBubbleImageMargin,size.width+KReceiverLeftBubbleImageMargin+KReceiverRightBubbleImageMargin,size.height+2*KTopBubbleImageMargin);
photoView.frame = CGRectMake(KReceiverLeftBubbleImageMargin,KTopBubbleImageMargin, size.width, size.height);
}
self.bubbleImageV.bubbleImage = nil;
break;
}
// 计算cell的高度
+ (CGFloat)cellHeight:(id)obj{
CGFloat avaterImageHeight = 45;
CGFloat bubbleViewHeight = 0;
TalkMessage *message = (TalkMessage *)obj;
switch (message.messageBubbleType) {
case MessageBubbleTypeText:{
bubbleViewHeight = [TalkCell BubbleTextViewSize:message].height;
bubbleViewHeight += KTopMargin*2;
break;
}
case MessageBubbleTypePhoto:{
bubbleViewHeight = [BubblePhotoView photoWithSize:message].height;
bubbleViewHeight += KTopMargin*2;
break;
}
default:
break;
}
if (bubbleViewHeight<avaterImageHeight) {
bubbleViewHeight = avaterImageHeight;
}
return KTopMargin+bubbleViewHeight+KTopMargin;;
}
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath{
id obj = [_array objectAtIndex:indexPath.row];
if ([obj isKindOfClass:[TalkMessage class]]) {
return CGSizeMake(self.view.bounds.size.width, [TalkCell cellHeight:obj]);
}
return CGSizeMake(self.view.bounds.size.width,30);;
}