[Swift通天遁地]八、媒体与动画-(5)使用开源类库绘制文字、图形、图像、图表、SVG

本文将演示如何通过金刚鹦鹉的类库,进行文字、图像、图表和图形的绘制。

首先确保已经安装了所需的第三方类库。双击查看安装配置文件【Podfile】

1 platform :ios, '9.0'
2 use_frameworks!
3 
4 target 'DemoApp' do
5     source 'https://github.com/CocoaPods/Specs.git'
6     pod "Macaw"
7 end

根据配置文件中的相关设置,安装第三方类库。

安装完成之后,双击打开项目文件【DemoApp.xcodeproj】

在项目中引入等待绘制的图像,以及一份SVG矢量图形文件,

图形文件由坐标、路径等内容组成。通过第三方类库,将图形文件绘制在屏幕上。

依次创建几份继承自金刚鹦鹉视图的自定义类。

在项目文件夹上点击鼠标右键,弹出右键菜单。

【New File】->【Cocoa Touch】->【Next】->

【Class】:TextSVGView

【Subclass of】:MacawView

【Language】:Swift

->【Next】->【Create】

在当前的类文件中,创建一个用于绘制文本的视图。

 1 import Foundation
 2 //引入已经安装的第三方类库
 3 import Macaw
 4 
 5 class TextSVGView: MacawView
 6 {
 7     //添加一个初始化方法
 8     required init?(coder aDecoder: NSCoder)
 9     {
10         //创建一个文字节点,并设置文字的内容,
11         //以及文字节点的位置。
12         let text = Text(text: "Hello, SVG!", place: .move(dx: 60, dy: 100))
13         //设置文字节点的字体属性
14         text.font = Font(name: "Arail", size: 42)
15         //实现父类的初始化方法,
16         super.init(node: text, coder: aDecoder)
17     }
18 }

在项目文件夹上点击鼠标右键,弹出右键菜单。

【New File】->【Cocoa Touch】->【Next】->

【Class】:ShapeSVGView

【Subclass of】:MacawView

【Language】:Swift

->【Next】->【Create】

在当前的类文件中,创建一个用于绘制图形的视图。 

 1 import UIKit
 2 //引入已经安装的第三方类库
 3 import Macaw
 4 
 5 class ShapeSVGView: MacawView
 6 {
 7     //添加一个初始化方法
 8     required init?(coder aDecoder: NSCoder)
 9     {
10         //创建一个图形节点,并设置图形节点的显示区域、填充颜色、边框等属性。
11         let shape1 = Shape(form: Rect(x: 60, y: 75, w: 180, h: 180),
12                           fill: Color(val: 0xfcc07c),
13                           stroke: Stroke(fill: Color(val: 0xff9e4f), width: 6))
14         
15         //创建第二个图形节点,设置图形的圆角半径为16
16         let shape2 = Shape(form: RoundRect(
17                           rect: Rect(x: 60, y: 275, w: 180, h: 180),
18                           rx: 16))
19         
20         //设置一个文字节点,并设置文字节点的内容、字体、颜色、对齐方式、基线和位置等属性。
21         let text = Text(
22             text: "Show",
23             font: Font(name: "Serif", size: 21),
24             fill: Color.white,
25             align: .mid,
26             baseline: .mid,
27             place: .move(dx: 300 / 2, dy: 165))
28         
29         //从项目中读取一张图片素材,设置宽度为80,并设置图片在视图中的位置。
30         //然后给图片添加一个触摸事件,当触摸事件发生时,更改文字节点的字体颜色为褐色
31         let image = Image(src: "coffee.png", w: 80, place: .move(dx: 110, dy: 320))
32         _ = image.onTap { (tapEvent) in
33             text.fill = Color.maroon
34             let location = tapEvent.location.toCG()
35             if let currentNode = svgView.findNodeAt(location: location) {
36                 print(currentNode.tag.first ?? "tag not found")
37            }
38         }
39         //初始化一个组节点
40         let group = Group()
41         //将上文创建的四个节点,添加到组中。
42         group.contents = [shape1, shape2, text, image]
43         //实现父类的初始化方法
44         super.init(node: group, coder: aDecoder)
45     }
46 }

在项目文件夹上点击鼠标右键,弹出右键菜单。

【New File】->【Cocoa Touch】->【Next】->

【Class】:MyChartView

【Subclass of】:MacawView

【Language】:Swift

->【Next】->【Create】

在当前的类文件中,创建一个用于绘制柱形图表的视图。

 1 import UIKit
 2 //引入已经安装的第三方类库
 3 import Macaw
 4 
 5 class MyChartView: MacawView
 6 {
 7     //初始化一个由数字组成的数组,作为图表的数据源。
 8     static let data: [Double] = [101, 142, 66, 178, 92]
 9     //初始化一个颜色数组,作为柱形的填充颜色
10     static let palette = [0xf08c00, 0xbf1a04, 0xffd505, 0x8fcc16, 0xd1aae3].map { val in Color(val: val)}
11     
12     //添加一个初始化方法
13     required init?(coder aDecoder: NSCoder)
14     {
15         //通过调用自定义方法,创建一个按钮节点。
16         //该按钮节点将被附加在图表上。
17         let button = MyChartView.createButton()
18         //通过调用自定义方法,创建一个图表对象。
19         let chart = MyChartView.createChart(button.contents[0])
20         //实现父类的初始化方法。
21         super.init(node: Group(contents: [button, chart]), coder: aDecoder)
22     }
23     
24     //添加一个自定义方法,用来创建一个附加在图表上的按钮节点,该按钮包含一个图标。
25     private static func createButton() -> Group
26     {
27         //初始化一个图形节点, 并设置它的颜色显示和填充颜色,
28         let shape = Shape(
29             form: Rect(x: -100, y: -15, w: 200, h: 30).round(r: 5),
30             //填充颜色是一个角度为90度的渐变色。
31             fill: LinearGradient(degree: 90, from: Color(val: 0xfcc07c), to: Color(val: 0xfc7600)),
32             //设置图形节点的边框颜色和边框的宽度
33             stroke: Stroke(fill: Color(val: 0xff9e4f), width: 1))
34         
35         //初始化一个文字节点,并设置文字内容、字体、颜色、对齐方式、基线、位置和不透明度等属性。
36         let text = Text(
37             text: "Show", font: Font(name: "Serif", size: 21),
38             fill: Color.white, align: .mid, baseline: .mid,
39             place: .move(dx: 15, dy: 0), opaque: false)
40         
41         //从项目中读取一张图片素材,以创建一个图像节点,作为按钮上的图标。
42         let image = Image(src: "charts.png", w: 30, place: .move(dx: -40, dy: -15), opaque: false)
43         
44         //最后返回一个包含三个节点的组
45         return Group(contents: [shape, text, image], place: .move(dx: 375 / 2, dy: 75))
46     }
47     
48     //添加另一个方法,用来绘制一张图表。
49     private static func createChart(_ button: Node) -> Group
50     {
51         //初始化一个节点数组。
52         var items: [Node] = []
53         
54         //添加一个6次的循环语句,用来创建六个y轴虚线。
55         for i in 1...6
56         {
57             //计算每条虚线的y轴坐标
58             let y = 200 - Double(i) * 30.0
59             //绘制一个线条,并设置线条的描边颜色。
60             items.append(Line(x1: -5, y1: y, x2: 275, y2: y).stroke(fill: Color(val: 0xF0F0F0)))
61             //在线条的左侧绘制y轴的数值标签。
62             items.append(Text(text: "\(i*30)", align: .max, baseline: .mid, place: .move(dx: -10, dy: y)))
63         }
64         
65         //通过自定义方法,绘制柱形节点,并将柱形节点添加到图表中。
66         items.append(createBars(button))
67         //绘制一个线条节点,作为图表的x轴。
68         items.append(Line(x1: 0, y1: 200, x2: 275, y2: 200).stroke())
69         //绘制图表的y轴
70         items.append(Line(x1: 0, y1: 0, x2: 0, y2: 200).stroke())
71         
72         //返回一个包含各节点的数组对象。
73         return Group(contents: items, place: .move(dx: 50, dy: 200))
74     }
75     
76     //添加一个方法,用来绘制柱状图形。
77     private static func createBars(_ button: Node) -> Group
78     {
79         //初始化一个节点数组
80         var items: [Node] = []
81         //对图表的数据源数组进行遍历
82         for (i, item) in data.enumerated()
83         {
84             //在循环语句中,创建在水平方向上不同位置的矩形节点,节点的高度为数组中的数据。
85             let bar = Shape(
86                 form: Rect(x: Double(i) * 50 + 25, y: 0, w: 30, h: item),
87                 fill: LinearGradient(degree: 90, from: palette[i], to: palette[i].with(a: 0.3)),
88                 place: .move(dx: 0, dy: -data[i]))
89             //将矩形节点添加到数组中
90             items.append(bar)
91         }
92         
93         //返回由5个矩形节点组成的组。
94         return Group(contents: items, place: .move(dx: 0, dy: 200))
95     }
96 }

在项目文件夹上点击鼠标右键,弹出右键菜单。

【New File】->【Cocoa Touch】->【Next】->

【Class】:SVGView

【Subclass of】:MacawView

【Language】:Swift

->【Next】->【Create】

在当前的类文件中,创建一个用于绘制SVG图形的视图。

 1 import UIKit
 2 //引入已经安装的第三方类库
 3 import Macaw
 4 
 5 class SVGView: MacawView
 6 {
 7     //添加一个初始化方法
 8     required init?(coder aDecoder: NSCoder)
 9     {
10         //在初始化方法中,通过第三方类库的解析方法,加载并解析项目中的指定名称的图形文件。
11         super.init(node: try! SVGParser.parse(resource: "tiger"), coder: aDecoder)
12     }
13 }

进入项目的故事板界面【Main.storyboard】

点击控件库图标,打开控件库的列表窗口。

在视图控件的上方双击,往故事板中插入一个视图。

点击属性检查器图标,进入属性设置面板。

依次设置视图对象的坐标和尺寸。

X:0   Y:0

Width:320    Height:568

点击身份检查器图标,进入身份设置面板。

在类名输入框内,输入自定义的类名,

首先输入用于绘制文字的自定义类。

【Class】:TextSVGView 

接着输入用于绘制图形的自定义类,

使故事板中的视图控件,显示自定义的图形。

【Class】:ShapeSVGView

接着输入用于绘制图表的自定义类,

使故事板中的视图控件,显示自定义的图表。

【Class】:MyChartView

接着输入用于绘制SVG(矢量图形)的自定义类,

【Class】:SVGView

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...