You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
219 lines
5.9 KiB
219 lines
5.9 KiB
// |
|
// UIImageView+MultiAvatar.m |
|
// ZtCampus |
|
// |
|
// Created by xx on 2019/10/24. |
|
// Copyright © 2019 hongtu. All rights reserved. |
|
// |
|
|
|
#import "UIImageView+MultiAvatar.h" |
|
|
|
#import <SDWebImage/UIImageView+WebCache.h> |
|
|
|
@implementation UIImageView (MultiAvatar) |
|
|
|
//设置群聊头像 |
|
- (void)ht_setImageWithURLStrArr:(NSArray *)arr { |
|
|
|
if (arr.count <= 0) { |
|
return; |
|
} |
|
else if (arr.count > 9) { |
|
|
|
//只显示9个头像 |
|
NSMutableArray *tempArr = [NSMutableArray array]; |
|
|
|
NSInteger index = 0; |
|
|
|
for (NSString *urlStr in arr) { |
|
|
|
if (index < 9) { |
|
|
|
[tempArr addObject:urlStr]; |
|
} |
|
|
|
index++; |
|
} |
|
|
|
arr = tempArr.copy; |
|
} |
|
|
|
//下载小头像 |
|
[self downImageWith:arr]; |
|
} |
|
|
|
//下载小头像 |
|
- (void)downImageWith:(NSArray *)arr { |
|
|
|
SDWebImageManager *manager = [SDWebImageManager sharedManager]; |
|
|
|
NSMutableArray *tempArr = [NSMutableArray arrayWithCapacity:arr.count]; |
|
|
|
//调度组 |
|
dispatch_group_t group = dispatch_group_create(); |
|
|
|
for (NSString *urlStr in arr) { |
|
|
|
NSURL *url = [NSURL URLWithString:urlStr]; |
|
|
|
dispatch_group_enter(group); |
|
|
|
dispatch_async(dispatch_get_global_queue(0, 0), ^{ |
|
|
|
//下载头像 |
|
[manager loadImageWithURL:url options:SDWebImageLowPriority progress:^(NSInteger receivedSize, NSInteger expectedSize, NSURL * _Nullable targetURL) { |
|
|
|
} completed:^(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, SDImageCacheType cacheType, BOOL finished, NSURL * _Nullable imageURL) { |
|
|
|
if (image) { |
|
|
|
[tempArr addObject:image]; |
|
} |
|
|
|
dispatch_group_leave(group); |
|
}]; |
|
}); |
|
} |
|
|
|
dispatch_group_notify(group, dispatch_get_main_queue(), ^{ |
|
|
|
//所有小头像绘制到一张图片上 |
|
UIImage *avatar = [self drawGroupAvatarWith:tempArr.copy]; |
|
self.image = avatar; |
|
}); |
|
} |
|
|
|
//绘制群头像 |
|
- (UIImage *)drawGroupAvatarWith:(NSArray *)arr { |
|
|
|
//群头像大小 |
|
CGSize avatarSize = CGSizeMake(121*kWidthScale, 121*kWidthScale); |
|
|
|
UIGraphicsBeginImageContextWithOptions(avatarSize, NO, [UIScreen mainScreen].scale); |
|
|
|
CGContextRef context = UIGraphicsGetCurrentContext(); |
|
//背景色 |
|
UIColor *bgColor = [[UIColor blackColor] colorWithAlphaComponent:0.1]; |
|
CGContextSetFillColorWithColor(context, bgColor.CGColor); |
|
CGContextFillRect(context, CGRectMake(0, 0, 121*kWidthScale, 121*kWidthScale)); |
|
|
|
//获取每个小头像的rect |
|
NSArray *rectArr = [self calculateEachRectWithCount:arr.count]; |
|
|
|
NSInteger index = 0; |
|
|
|
for (UIImage *image in arr) { |
|
|
|
if (index > rectArr.count - 1) { |
|
|
|
break; |
|
} |
|
|
|
CGRect rect = CGRectFromString([rectArr objectAtIndex:index]); |
|
|
|
//绘制小头像 |
|
[image drawInRect:rect]; |
|
|
|
index++; |
|
} |
|
|
|
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); |
|
|
|
UIGraphicsEndImageContext(); |
|
|
|
return newImage; |
|
} |
|
|
|
//获取每个小头像的rect |
|
- (NSArray *)calculateEachRectWithCount:(NSInteger)count { |
|
|
|
NSMutableArray *tempArr = [[NSMutableArray alloc] initWithCapacity:count]; |
|
|
|
if (count == 1) { |
|
|
|
CGRect rect = CGRectMake(33*kWidthScale, 33*kWidthScale, 55*kWidthScale, 55*kWidthScale); |
|
|
|
[tempArr addObject:NSStringFromCGRect(rect)]; |
|
} |
|
else { |
|
|
|
[self getRects:tempArr count:(int)count]; |
|
} |
|
|
|
return tempArr.copy; |
|
} |
|
|
|
|
|
//计算每个小头像的位置 |
|
- (void)getRects:(NSMutableArray *)array count:(int)count { |
|
|
|
int row_num = 0;//行数 |
|
int col_num = 0;//列数 |
|
|
|
CGFloat margin = 5*kWidthScale; |
|
CGFloat avatarWH = 121*kWidthScale; |
|
|
|
if (count == 2) { |
|
|
|
row_num = 1; |
|
col_num = 2; |
|
} |
|
else if (count <= 4) { |
|
|
|
row_num = col_num = 2; |
|
} |
|
else { |
|
|
|
col_num = 3; |
|
row_num = (count - 1) / col_num + 1; |
|
} |
|
|
|
CGFloat width = (avatarWH - margin * (col_num + 1)) / col_num; |
|
CGFloat origin_y = (avatarWH - width * row_num - margin * (row_num - 1)) / 2; |
|
|
|
int remainder = count % col_num;//第一行的个数(不满一行) |
|
|
|
if (remainder == 0) { |
|
|
|
//按九宫格计算 |
|
for (int i = 0; i < count; i++) { |
|
|
|
int col = i % col_num;//列 |
|
int row = i / col_num;//行 |
|
|
|
CGFloat x = margin * (col+1) + width * col; |
|
CGFloat y = origin_y + (width + margin) * row; |
|
|
|
CGRect rect = CGRectMake(x, y, width, width); |
|
|
|
[array addObject:NSStringFromCGRect(rect)]; |
|
} |
|
} |
|
else { |
|
|
|
//先计算第一行(第一行不铺满,只有1个或者2个) |
|
CGFloat constant_x = (col_num - remainder) * width / 2; |
|
|
|
for (NSInteger i = 0; i < remainder; i++) { |
|
|
|
int col = i % count;//列 |
|
|
|
CGRect rect = CGRectMake(constant_x + margin * (col+1) + width * col, origin_y, width, width); |
|
|
|
[array addObject:NSStringFromCGRect(rect)]; |
|
} |
|
|
|
//余下的按照九宫格计算 |
|
for (int i = 0; i < count - remainder; i++) { |
|
|
|
int col = i % col_num;//列 |
|
int row = i / col_num;//行 |
|
|
|
CGRect rect = CGRectMake(margin * (col+1) + width * col, origin_y + (width + margin) * (row + 1), width, width); |
|
|
|
[array addObject:NSStringFromCGRect(rect)]; |
|
} |
|
} |
|
} |
|
|
|
@end
|
|
|