读书想法简友广场

iOS 群头像的简单实现

2022-08-09  本文已影响0人  海边的遐想

我们在做群聊的时候,都会遇到群头像的设置问题,那么类似微信群头像的方式是如何实现的呢
下面有两种方式实现:
1,使用 SDWebImage 下载,计算每一个群员头像在群头像中的位置,不同数量的群员,群头像有不同的UI
根据计算的 rect,把所有群员的头像(最多9张)绘制在一个 image 上
绘制出来的 image 作为群头像
-(void)greateGroupAvatar:(NSArray )group view:(UIView)view finished:(void (^)(UIImage *groupAvatar))finished
{
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSInteger avatarCount = group.count > 9 ? 9 : group.count;
CGFloat width = ViewWidth / 3 * 0.85;
CGFloat space3 = (ViewWidth - width * 3) / 4; // 三张图时的边距(图与图之间的边距)
CGFloat space2 = (ViewWidth - width * 2 + space3) / 2; // 两张图时的边距
CGFloat space1 = (ViewWidth - width) / 2; // 一张图时的边距
CGFloat y = avatarCount > 6 ? space3 : (avatarCount > 3 ? space2 : space1);
CGFloat x = avatarCount % 3 == 0 ? space3 : (avatarCount % 3 == 2 ? space2 : space1);
width = avatarCount > 4 ? width : (avatarCount > 1 ? (ViewWidth - 3 * space3) / 2 : ViewWidth ); // 重新计算width;

    if (avatarCount == 1) {                                          // 1,2,3,4 张图不同
        x = 0;
        y = 0;
    }
    if (avatarCount == 2) {
        x = space3;
    } else if (avatarCount == 3) {
        x = (ViewWidth -width)/2;
        y = space3;
    } else if (avatarCount == 4) {
        x = space3;
        y = space3;
    }
    __block NSInteger count = 0;
    //下载图片完成的计数
    for (NSInteger i = avatarCount - 1; i >= 0; i--) {
        NSString *avatarUrl = [group objectAtIndex:i];
        dispatch_async(dispatch_get_main_queue(), ^{
            UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(x, y, width, width)];
            [view addSubview:imageView];
            NSString *url = [avatarUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
            [imageView sd_setImageWithURL:[NSURL URLWithString:url] placeholderImage:[UIImage imageNamed:@"headdefault"] completed:^(UIImage * _Nullable image, NSError * _Nullable error, SDImageCacheType cacheType, NSURL * _Nullable imageURL) {
                count ++ ;
                if (count == avatarCount) {     //图片全部下载完成
                    UIGraphicsBeginImageContextWithOptions(view.frame.size, NO, 2.0);
                    [view.layer renderInContext:UIGraphicsGetCurrentContext()];
                    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
                    UIGraphicsEndPDFContext();
                    CGImageRef imageRef = image.CGImage;
                    CGImageRef imageRefRect = CGImageCreateWithImageInRect(imageRef, CGRectMake(0, 0, view.frame.size.width*2, view.frame.size.height*2));
                    UIImage *ansImage = [[UIImage alloc] initWithCGImage:imageRefRect];
                    CGImageRelease(imageRefRect);
                    dispatch_async(dispatch_get_main_queue(), ^{
                        if (finished) {
                            finished(ansImage);
                        }
                });
                }
            }];
            
        }); 
     if (avatarCount == 3) {
            if (i == 2) {
                y = width + space3*2;
                x = space3;
            } else {
                x += width + space3;
            }
        } else if (avatarCount == 4) {
            if (i % 2 == 0) {
                y += width +space3;
                x = space3;
            } else {
                x += width +space3;
            }
        } else {
             if (i % 3 == 0 ) {
                 y += (width + space3);
                 x = space3;
             } else {
                 x += (width + space3);
             }
        }
    }
});

}
2,实用第三方封装好的CDDGroupAvatar

上一篇下一篇

猜你喜欢

热点阅读