本文实例为大家分享了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
|
import foundation import uikit class gradientvc: uiviewcontroller { @iboutlet weak var butone: gradientcustombutton! @iboutlet weak var viewtwo: uiview! override func viewdidload() { super.viewdidload() /// 方式一 xib添加渐变色 /// 方式一 代码添加渐变色 butone.isgradient = true butone.startcolor = uicolor(hexstring: "#fd0134" )! butone.endcolor = uicolor(hexstring: "#007aff" )! butone.startpoint = cgpoint(x: 0,y: 0) butone.endpoint = cgpoint(x: 1,y: 1) /// 方式二 //viewtwo.addgradient(start_color: "#8238ff", end_color: "#007aff") //viewtwo.layer.maskstobounds = true viewtwo.addgradient(colors: [uicolor(hexstring: "#fd0134" )!, uicolor(hexstring: "#007aff" )!], point: (cgpoint(x: 1.0, y: 0.0), cgpoint(x: 0.0, y: 1.0)), frame: cgrect(x: 0, y: 0, width: uiscreen.main.bounds.width-40, height: 100), radius: 0) } } |
方式一:
使用xib或代码的方式添加渐变色.
这种方式有个缺点, 若是要对更多的视图(比如uilabel)添加渐变色, 需要继续创建一个子类继承于它进行功能的拓展.
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
|
import foundation import uikit class gradientcustomview: uiview { @ibinspectable var isgradient: bool = false @ibinspectable var startcolor: uicolor = .white @ibinspectable var endcolor: uicolor = .white @ibinspectable var locations: [nsnumber] = [0 , 1] @ibinspectable var startpoint: cgpoint = .zero @ibinspectable var endpoint: cgpoint = .zero private var gradientbglayer: cagradientlayer? override func layoutsubviews() { super.layoutsubviews() gradientbglayer?.removefromsuperlayer() if isgradient { gradientbglayer = cagradientlayer() gradientbglayer!.colors = [startcolor.cgcolor, endcolor.cgcolor] gradientbglayer!.locations = locations gradientbglayer!.frame = bounds gradientbglayer!.startpoint = startpoint gradientbglayer!.endpoint = endpoint self.layer.insertsublayer(gradientbglayer!, at: 0) } } } class gradientcustombutton: uibutton { @ibinspectable var isgradient: bool = false @ibinspectable var startcolor: uicolor = .white @ibinspectable var endcolor: uicolor = .white @ibinspectable var locations: [nsnumber] = [0 , 1] @ibinspectable var startpoint: cgpoint = .zero @ibinspectable var endpoint: cgpoint = .zero private var gradientbglayer: cagradientlayer? override func layoutsubviews() { super.layoutsubviews() gradientbglayer?.removefromsuperlayer() if isgradient { gradientbglayer = cagradientlayer() gradientbglayer!.colors = [startcolor.cgcolor, endcolor.cgcolor] gradientbglayer!.locations = locations gradientbglayer!.frame = bounds gradientbglayer!.startpoint = startpoint gradientbglayer!.endpoint = endpoint self.layer.insertsublayer(gradientbglayer!, at: 0) } } } |
方式二:
直接拓展uiview,让每个继承于uiview的视图都可以调用拓展的方法.
这种方式的缺点就是无法在xib中使用
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
120
121
122
123
124
125
126
127
128
129
130
131
132
|
import foundation import uikit extension uiview { @discardableresult func addgradient(colors: [uicolor], point: (cgpoint, cgpoint) = (cgpoint(x: 0.5, y: 0), cgpoint(x: 0.5, y: 1)), locations: [nsnumber] = [0, 1], frame: cgrect = cgrect.zero, radius: cgfloat = 0, at: uint32 = 0) -> cagradientlayer { let bglayer1 = cagradientlayer() bglayer1.colors = colors.map { $0.cgcolor } bglayer1.locations = locations if frame == .zero { bglayer1.frame = self.bounds } else { bglayer1.frame = frame } bglayer1.startpoint = point.0 bglayer1.endpoint = point.1 bglayer1.cornerradius = radius self.layer.insertsublayer(bglayer1, at: at) return bglayer1 } func addgradient(start: cgpoint = cgpoint(x: 0.5, y: 0), end: cgpoint = cgpoint(x: 0.5, y: 1), colors: [uicolor], locations: [nsnumber] = [0, 1], frame: cgrect = cgrect.zero, radius: cgfloat = 0, at: uint32 = 0) { let bglayer1 = cagradientlayer() bglayer1.colors = colors.map { $0.cgcolor } bglayer1.locations = locations bglayer1.frame = frame bglayer1.startpoint = start bglayer1.endpoint = end bglayer1.cornerradius = radius self.layer.insertsublayer(bglayer1, at: at) } func addgradient(start_color:string,end_color : string,frame : cgrect?=nil,cornerradius : cgfloat?=0, at: uint32 = 0){ var bounds : cgrect = self.bounds if let frame = frame { bounds = frame } let bglayer1 = cagradientlayer() bglayer1.colors = [uicolor(hexstring: start_color)!.cgcolor, uicolor(hexstring: end_color)!.cgcolor] bglayer1.locations = [0, 1] bglayer1.frame = bounds bglayer1.startpoint = cgpoint(x: 0, y: 0.61) bglayer1.endpoint = cgpoint(x: 0.61, y: 0.61) bglayer1.cornerradius = cornerradius ?? 0 self.layer.insertsublayer(bglayer1, at: at) } func addgradient(start_color:string, end_color : string, frame : cgrect?=nil, borader: cgfloat = 0, boradercolor: uicolor = .clear, at: uint32 = 0, corners: uirectcorner?, radius: cgfloat = 0) { var bounds : cgrect = self.bounds if let frame = frame { bounds = frame } let bglayer1 = cagradientlayer() bglayer1.colors = [uicolor(hexstring: start_color)!.cgcolor, uicolor(hexstring: end_color)!.cgcolor] bglayer1.locations = [0, 1] bglayer1.frame = bounds bglayer1.startpoint = cgpoint(x: 0, y: 0.61) bglayer1.endpoint = cgpoint(x: 0.61, y: 0.61) bglayer1.bordercolor = boradercolor.cgcolor bglayer1.borderwidth = borader if corners != nil { let cornerpath = uibezierpath(roundedrect: bounds, byroundingcorners: corners!, cornerradii: cgsize(width: radius, height: radius)) let radiuslayer = cashapelayer() radiuslayer.frame = bounds radiuslayer.path = cornerpath.cgpath bglayer1.mask = radiuslayer } self.layer.insertsublayer(bglayer1, at: at) } func addgradient(startpoint: cgpoint = cgpoint(x: 0, y: 0.5), start_color:string, endpoint: cgpoint = cgpoint(x: 1, y: 0.5), end_color : string, frame : cgrect? = nil, cornerradius : cgfloat?=0){ var bounds : cgrect = self.bounds if let frame = frame { bounds = frame } let bglayer1 = cagradientlayer() bglayer1.frame = bounds bglayer1.startpoint = startpoint bglayer1.endpoint = endpoint bglayer1.colors = [uicolor(hexstring: start_color)!.cgcolor, uicolor(hexstring: end_color)!.cgcolor] bglayer1.locations = [0, 1] bglayer1.cornerradius = cornerradius ?? 0 self.layer.addsublayer(bglayer1) } func addverticalgradient(start_color:string,end_color : string,frame : cgrect?=nil,cornerradius : cgfloat?=0){ var bounds : cgrect = self.bounds if let frame = frame { bounds = frame } let bglayer1 = cagradientlayer() bglayer1.colors = [uicolor(hexstring: start_color)!.cgcolor, uicolor(hexstring: end_color)!.cgcolor] bglayer1.locations = [0, 1] bglayer1.frame = bounds bglayer1.startpoint = cgpoint(x: 0.5, y: 0) bglayer1.endpoint = cgpoint(x: 1, y: 1) bglayer1.cornerradius = cornerradius ?? 0 self.layer.insertsublayer(bglayer1, at: 0) } //将当前视图转为uiimage func asimage() -> uiimage { let renderer = uigraphicsimagerenderer(bounds: bounds) return renderer.image { renderercontext in layer.render(in: renderercontext.cgcontext) } } } |
demo:https://github.com/Gamin-fzym/GAGradientRampDemo.git
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/wsyx768/article/details/119422014