Swift - 微信聊天群头像实现 (群聊的组合头像)
1,样例效果图
2,样例代码
- 首先根据图片数量的不同,我们先初步生成田字格或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 i 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 i 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 i 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 i 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 i in 0..<2 {
array[i].origin.x = array[i].origin.x - (padding+cellWH)/2
}
}
return array
}
}
|
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 ViewController : UIViewController {
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 - 微信聊天群头像实现 (群聊的组合头像)相关推荐
- react仿微信聊天室|react即时聊天IM系统|react群聊
react+redux仿微信聊天IM实战|react仿微信界面|react多人群聊天室 最近一直捣鼓react开发,就运用react开发了个仿微信聊天室reactChatRoom项目,基于react+ ...
- python微信群聊机器人_Python + itchat 实现微信机器人聊天(支持自动回复指定群聊)...
Python + itchat 实现微信机器人聊天(支持自动回复指定群聊) 发布时间:2018-10-25 22:38, 浏览次数:600 , 标签: Python itchat <>Py ...
- Android 仿钉钉、微信 群聊组合头像
CombineBitmap 项目地址:SheHuan/CombineBitmap 简介: Android 仿钉钉.微信 群聊组合头像 更多:作者 提 Bug 标签: 效果预览 功能 生成类似钉 ...
- java模仿微信QQ群聊头像拼接,根据群聊内的用户头像拼接群聊头像,九宫格
java模仿微信QQ群聊头像拼接,根据群聊内的用户头像拼接群聊头像,九宫格 效果图,这里只放了几张,1-9张图片都可以的,如果图片路径是从数据库查出来的相对路径,记得加上绝对路径否则会报找不到读取文件 ...
- Android 仿钉钉、微信 群聊组合头像,Android插件化入门指南
简介: Android 仿钉钉.微信 群聊组合头像 更多:作者 提 Bug 标签: 效果预览 | | | | | | - | - | - | - | | | | | | | | | | | 功 ...
- Android 仿钉钉、微信 群聊组合头像,大厂面试题汇总
效果预览 | | | | | | - | - | - | - | | | | | | | | | | | 功能 生成类似钉钉.微信 群聊组合头像 Bitmap 可使用图片资源 id.bitmap ...
- Android 仿钉钉、微信 群聊组合头像 CombineBitmap
前段时间,产品提出群组头像改为类似微信的九宫格图像,于是在网上找了一个非常好用的控件CombineBitmap,在这里记录一下. 作者的GitHub项目地址:https://github.com/Ot ...
- Android仿微信视频群聊,Android 仿钉钉、微信 群聊组合头像
功能生成类似钉钉.微信 群聊组合头像Bitmap 可使用图片资源id.bitmap或者使用url从网络加载,传入对应数组即可 网络加载时支持线程池 支持磁盘缓存.内存缓存.(记得申请磁盘缓存需要的文件 ...
- Python + itchat 实现微信机器人聊天(支持自动回复指定群聊)
Python + itchat 实现微信机器人聊天(支持自动回复指定群聊) 最近对Python上瘾,闲来无事搞个Python+itchat玩下微信机器人自动回复. 首先要打开cmd输入以下代码,安装r ...
最新文章
- K 近邻法(K-Nearest Neighbor, K-NN)
- 统计twitter帖子_在Kubernetes上部署InfluxDB和Grafana以收集Twitter统计信息
- linux中fopen和open的区别,Linux下open与fopen的区别
- 小菜鸟一步步打造图书馆外挂之十三:用户编辑界面的实现
- Native方式运行Fabric(非Docker方式)
- Feature Extraction
- 获取简单的输入和渲染窗口(Hello Window)
- android 可拖拽View的简单实现
- 深度学习 占用gpu内存 使用率为0_2020年深度学习最佳GPU一览,看看哪一款最适合你!...
- Java中字符串的全部知识_java基础教程之字符串的介绍,比较重要的一个知识点「中」...
- 华为交换机做qos案例_华为交换机QoS在企业网络中的应用
- 【21】基于java的旅游信息管理系统
- Vocaloid简介
- 波长与颜色的对应关系之python实现
- Linux、Qt等安装镜像下载--清华大学开源软件镜像站
- 服务器域共享文件夹,访问域共享文件夹
- 小米10pro第二个摄像头下面_小米10 Pro拍照翻车?暂不支持超广角超级夜景,官方回应...
- c语言十进制转ieee754代码,C#IEEE754到十进制(C# IEEE754 to decimal)
- jndi weblogic mysql_WebLogic配置JNDI数据源
- optics hecht pdf 5_干货分享:这些PDF文件压缩工具都是你不容错过的!