1,样例效果图

(1)组合图片的功能我使用扩展 UIImage 的方式实现。
(2)根据初始化传入的图片数组中图片数量的不同(超过9张图片的话也只显示前9个),组件会自动设置内部图片的尺寸和位置。
(3)除了只有一张图片的情况外。内部小图片尺寸实际上只有两种。即小于等于4张,或者大于4张这两种情况。
(4)生成返回的是一个 UIImage 对象,为了让头像图标有圆角效果。这里给 imageView 设置了相关圆角属性。

2,样例代码

(1)UIImageExGroupIcon.swift(扩展 UImage 实现具体功能)
  • 首先根据图片数量的不同,我们先初步生成田字格或9宫格这两种单元格布局。
  • 再根据实际数量,删除多余单元格,并调整单元格位置。
  • 最后将各个 image 绘制到对应的单元格雨区上。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
import UIKit
extension UIImage {
     
    //生成群聊图标
    class func groupIcon(wh:CGFloat, images:[UIImage], bgColor:UIColor?) -> UIImage {
        let finalSize = CGSize(width:wh, height:wh)
        var rect: CGRect CGRect.zero
        rect.size = finalSize
         
        //开始图片处理上下文(由于输出的图不会进行缩放,所以缩放因子等于屏幕的scale即可
        UIGraphicsBeginImageContextWithOptions(finalSize, false, 0)
         
        //绘制背景
        if (bgColor != nil) {
            let context: CGContext UIGraphicsGetCurrentContext()!
            //添加矩形背景区域
            context.addRect(rect)
            //设置填充颜色
            context.setFillColor(bgColor!.cgColor)
            context.drawPath(using: .fill)
        }
         
        //绘制图片
        if images.count >= 1 {
            //获取群聊图标中每个小图片的位置尺寸
            var rects = self.getRectsInGroupIcon(wh:wh, count:images.count)
            var count = 0
            //将每张图片绘制到对应的区域上
            for image in images {
                if count > rects.count-1 {
                    break
                }
                 
                let rect = rects[count]
                image.draw(in: rect)
                count = count + 1
            }
        }
         
        let newImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return newImage!
    }
     
    //获取群聊图标中每个小图片的位置尺寸
    class func getRectsInGroupIcon(wh:CGFloat, count:Int) -> [CGRect] {
        //如果只有1张图片就直接占全部位置
        if count == 1 {
            return [CGRect(x:0, y:0, width:wh, height:wh)]
        }
         
        //下面是图片数量大于1张的情况
        var array = [CGRect]()
        //图片间距
        var padding: CGFloat = 10
        //小图片尺寸
        var cellWH: CGFloat
        //用于后面计算的单元格数量(小于等于4张图片算4格单元格,大于4张算9格单元格)
        var cellCount:Int
         
        if count <= 4 {
            cellWH = (wh-padding*3)/2
            cellCount = 4
        else {
            padding = padding/2
            cellWH = (wh-padding*4)/3
            cellCount = 9
        }
         
        //总行数
        let rowCount = Int(sqrt(Double(cellCount)))
        //根据单元格长宽,间距,数量返回所有单元格初步对应的位置尺寸
        for in 0..<cellCount {
            //当前行
            let row = i/rowCount
            //当前列
            let column = i%rowCount
            let rect = CGRect(x:padding*CGFloat(column+1)+cellWH*CGFloat(column),
                              y:padding*CGFloat(row+1)+cellWH*CGFloat(row),
                              width:cellWH, height:cellWH)
            array.append(rect)
        }
        //根据实际图片的数量再调整单元格的数量和位置
        if count == 2 {
            array.removeSubrange(0...1)
            for in 0..<array.count {
                array[i].origin.y = array[i].origin.y - (padding+cellWH)/2
            }
        }else if count == 3 {
            array.remove(at: 0)
            array[0].origin.x = (wh-cellWH)/2
        }else if count == 5 {
            array.removeSubrange(0...3)
            for in 0..<array.count {
                if i<2 {
                    array[i].origin.x = array[i].origin.x - (padding+cellWH)/2
                }
                array[i].origin.y = array[i].origin.y - (padding+cellWH)/2
            }
        }else if count == 6 {
            array.removeSubrange(0...2)
            for in 0..<array.count {
                array[i].origin.y = array[i].origin.y - (padding+cellWH)/2
            }
        }else if count == 7 {
            array.removeSubrange(0...1)
            array[0].origin.x = (wh-cellWH)/2
        }
        else if count == 8 {
            array.remove(at: 0)
            for in 0..<2 {
                array[i].origin.x = array[i].origin.x - (padding+cellWH)/2
            }
        }
        return array
    }
}

(2)ViewController.swift(测试代码)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
import UIKit
class ViewControllerUIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
         
        //图标初始化
        let image0 = UIImage(named:"0")!
        let image1 = UIImage(named:"1")!
        let image2 = UIImage(named:"2")!
        let image3 = UIImage(named:"3")!
        let image4 = UIImage(named:"4")!
        let image5 = UIImage(named:"5")!
        let image6 = UIImage(named:"6")!
        let image7 = UIImage(named:"7")!
        let image8 = UIImage(named:"8")!
        //聊天群图标尺寸(长宽一样)
        let viewWH:CGFloat = 100
         
        //聊天群图标背景色(这里使用灰色,不设置的话则是透明的)
        let viewBgColor = UIColor(red: 0, green:0, blue: 0, alpha: 0.1)
         
        //imageView的圆角半径
        let corner = viewWH/20
       
        //创建生成各种情况的聊天群图标
        let imageView0 = UIImageView(frame: CGRect(x:5,y:20,width:viewWH,height:viewWH))
        imageView0.image = UIImage.groupIcon(wh:viewWH, images:[image0],
                                             bgColor:viewBgColor)
        imageView0.layer.masksToBounds = true
        imageView0.layer.cornerRadius = corner  //圆角
        self.view.addSubview(imageView0)
         
        let imageView1 = UIImageView(frame: CGRect(x:110,y:20,width:viewWH,height:viewWH))
        imageView1.image = UIImage.groupIcon(wh:viewWH, images:[image0,image1],
                                             bgColor:viewBgColor)
        imageView1.layer.masksToBounds = true
        imageView1.layer.cornerRadius = corner  //圆角
        self.view.addSubview(imageView1)
         
        let imageView2 = UIImageView(frame: CGRect(x:215,y:20,width:viewWH,height:viewWH))
        imageView2.image = UIImage.groupIcon(wh:viewWH, images:[image0,image1,image2],
                                             bgColor:viewBgColor)
        imageView2.layer.masksToBounds = true
        imageView2.layer.cornerRadius = corner  //圆角
        self.view.addSubview(imageView2)
         
        let imageView3 = UIImageView(frame: CGRect(x:5,y:125,width:viewWH,height:viewWH))
        imageView3.image = UIImage.groupIcon(wh:viewWH, images:[image0,image1,image2,
                                                                image3],
                                             bgColor:viewBgColor)
        imageView3.layer.masksToBounds = true
        imageView3.layer.cornerRadius = corner  //圆角
        self.view.addSubview(imageView3)
         
        let imageView4 = UIImageView(frame: CGRect(x:110,y:125,width:viewWH,height:viewWH))
        imageView4.image = UIImage.groupIcon(wh:viewWH, images:[image0,image1,image2,
                                                                image3,image4],
                                             bgColor:viewBgColor)
        imageView4.layer.masksToBounds = true
        imageView4.layer.cornerRadius = corner  //圆角
        self.view.addSubview(imageView4)
         
        let imageView5 = UIImageView(frame: CGRect(x:215,y:125,width:viewWH,height:viewWH))
        imageView5.image = UIImage.groupIcon(wh:viewWH, images:[image0,image1,image2,
                                                                image3,image4,image5],
                                             bgColor:viewBgColor)
        imageView5.layer.masksToBounds = true
        imageView5.layer.cornerRadius = corner  //圆角
        self.view.addSubview(imageView5)
         
        let imageView6 = UIImageView(frame: CGRect(x:5,y:230,width:viewWH,height:viewWH))
        imageView6.image = UIImage.groupIcon(wh:viewWH, images:[image0,image1,image2,
                                                                image3,image4,image5,
                                                                image6],
                                             bgColor:viewBgColor)
        imageView6.layer.masksToBounds = true
        imageView6.layer.cornerRadius = corner  //圆角
        self.view.addSubview(imageView6)
         
        let imageView7 = UIImageView(frame: CGRect(x:110,y:230,width:viewWH,height:viewWH))
        imageView7.image = UIImage.groupIcon(wh:viewWH, images:[image0,image1,image2,
                                                                image3,image4,image5,
                                                                image6,image7],
                                             bgColor:viewBgColor)
        imageView7.layer.masksToBounds = true
        imageView7.layer.cornerRadius = corner  //圆角
        self.view.addSubview(imageView7)
         
        let imageView8 = UIImageView(frame: CGRect(x:215,y:230,width:viewWH,height:viewWH))
        imageView8.image = UIImage.groupIcon(wh:viewWH, images:[image0,image1,image2,
                                                                image3,image4,image5,
                                                                image6,image7,image8],
                                             bgColor:viewBgColor)
        imageView8.layer.masksToBounds = true
        imageView8.layer.cornerRadius = corner  //圆角
        self.view.addSubview(imageView8)
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

源码下载 hangge_1463.zip
原文出自: www.hangge.com   转载请保留原文链接: http://www.hangge.com/blog/cache/detail_1463.html

Swift - 微信聊天群头像实现 (群聊的组合头像)相关推荐

  1. react仿微信聊天室|react即时聊天IM系统|react群聊

    react+redux仿微信聊天IM实战|react仿微信界面|react多人群聊天室 最近一直捣鼓react开发,就运用react开发了个仿微信聊天室reactChatRoom项目,基于react+ ...

  2. python微信群聊机器人_Python + itchat 实现微信机器人聊天(支持自动回复指定群聊)...

    Python + itchat 实现微信机器人聊天(支持自动回复指定群聊) 发布时间:2018-10-25 22:38, 浏览次数:600 , 标签: Python itchat <>Py ...

  3. Android 仿钉钉、微信 群聊组合头像

    CombineBitmap 项目地址:SheHuan/CombineBitmap 简介: Android 仿钉钉.微信 群聊组合头像 更多:作者   提 Bug 标签: 效果预览   功能 生成类似钉 ...

  4. java模仿微信QQ群聊头像拼接,根据群聊内的用户头像拼接群聊头像,九宫格

    java模仿微信QQ群聊头像拼接,根据群聊内的用户头像拼接群聊头像,九宫格 效果图,这里只放了几张,1-9张图片都可以的,如果图片路径是从数据库查出来的相对路径,记得加上绝对路径否则会报找不到读取文件 ...

  5. Android 仿钉钉、微信 群聊组合头像,Android插件化入门指南

    简介: Android 仿钉钉.微信 群聊组合头像 更多:作者   提 Bug 标签: 效果预览 | | | |   | | - | - | - | - | | | | | | | | | | | 功 ...

  6. Android 仿钉钉、微信 群聊组合头像,大厂面试题汇总

    效果预览 | | | |   | | - | - | - | - | | | | | | | | | | | 功能 生成类似钉钉.微信 群聊组合头像 Bitmap 可使用图片资源 id.bitmap ...

  7. Android 仿钉钉、微信 群聊组合头像 CombineBitmap

    前段时间,产品提出群组头像改为类似微信的九宫格图像,于是在网上找了一个非常好用的控件CombineBitmap,在这里记录一下. 作者的GitHub项目地址:https://github.com/Ot ...

  8. Android仿微信视频群聊,Android 仿钉钉、微信 群聊组合头像

    功能生成类似钉钉.微信 群聊组合头像Bitmap 可使用图片资源id.bitmap或者使用url从网络加载,传入对应数组即可 网络加载时支持线程池 支持磁盘缓存.内存缓存.(记得申请磁盘缓存需要的文件 ...

  9. Python + itchat 实现微信机器人聊天(支持自动回复指定群聊)

    Python + itchat 实现微信机器人聊天(支持自动回复指定群聊) 最近对Python上瘾,闲来无事搞个Python+itchat玩下微信机器人自动回复. 首先要打开cmd输入以下代码,安装r ...

最新文章

  1. K 近邻法(K-Nearest Neighbor, K-NN)
  2. 统计twitter帖子_在Kubernetes上部署InfluxDB和Grafana以收集Twitter统计信息
  3. linux中fopen和open的区别,Linux下open与fopen的区别
  4. 小菜鸟一步步打造图书馆外挂之十三:用户编辑界面的实现
  5. Native方式运行Fabric(非Docker方式)
  6. Feature Extraction
  7. 获取简单的输入和渲染窗口(Hello Window)
  8. android 可拖拽View的简单实现
  9. 深度学习 占用gpu内存 使用率为0_2020年深度学习最佳GPU一览,看看哪一款最适合你!...
  10. Java中字符串的全部知识_java基础教程之字符串的介绍,比较重要的一个知识点「中」...
  11. 华为交换机做qos案例_华为交换机QoS在企业网络中的应用
  12. 【21】基于java的旅游信息管理系统
  13. Vocaloid简介
  14. 波长与颜色的对应关系之python实现
  15. Linux、Qt等安装镜像下载--清华大学开源软件镜像站
  16. 服务器域共享文件夹,访问域共享文件夹
  17. 小米10pro第二个摄像头下面_小米10 Pro拍照翻车?暂不支持超广角超级夜景,官方回应...
  18. c语言十进制转ieee754代码,C#IEEE754到十进制(C# IEEE754 to decimal)
  19. jndi weblogic mysql_WebLogic配置JNDI数据源
  20. optics hecht pdf 5_干货分享:这些PDF文件压缩工具都是你不容错过的!

热门文章

  1. 微服务09——中间件
  2. 在Ubuntu18.04 LTS下升级Python版本
  3. [Delphi] 多线程编程
  4. 企业做CMMI认证有什么用?
  5. linux 安装toolchain工具
  6. springboot+Zuul网关服务
  7. 易语言模拟器中控源码 全新手游模拟器通用中控源码, 适用于各种游戏, 源码现成的只需要更换游戏就可以用哦
  8. mp4类文件的AAC编码完美修复方法
  9. epub 电子书的制作
  10. 矩阵求导公式(引自维基百科)