[Swift通天遁地]八、媒體與動畫-(5)使用開源類庫繪制文字、圖形、圖像、圖表、SVG
本文將演示如何通過金剛鸚鵡的類庫,進行文字、圖像、圖表和圖形的繪制。
首先確保已經安裝了所需的第三方類庫。雙擊查看安裝配置文件【Podfile】
1 platform :ios, ‘12.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 Macaw4 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
[Swift通天遁地]八、媒體與動畫-(5)使用開源類庫繪制文字、圖形、圖像、圖表、SVG