利用 UIBezierPath 實現圓環進度條,甜甜圈圖表 & 圓餅圖

這次一樣要透過貝茲曲線來畫圓餅圖,但是因為很多教學都已經給了原始碼,只要研讀一下再使用Playground就可以畫出來,但感覺上沒有什麼太大的效果,所以這次想要找一個畫面來做看看。

成品圖

集保e存摺 (模仿圖)

使用Playground

先使用Playground來跑可以先測試,也不用花太多時間在拉畫面或調整整個storyboard,playground有個好處就是可以邊寫邊執行,就可以看到成果。

(一)定義常數

將可能常用的值定義成常數,這樣之後要改變就比較容易。

let aDegree = CGFloat.pi / 180 // 每度,也就是1度多少

let lineWidth: CGFloat = 20 // 線條(內徑)寬度

let radius: CGFloat = 150 // 圓心的距離

let startDegree: CGFloat = 270 // 起點

(二)繪製一個圓形當底

let circlePath = UIBezierPath(ovalIn: CGRect(x: lineWidth, y: lineWidth, width: radius*2, height: radius*2))

let circleLayer = CAShapeLayer()

circleLayer.path = circlePath.cgPath

circleLayer.strokeColor = UIColor.gray.cgColor //邊框顏色

circleLayer.lineWidth = lineWidth //邊框粗細

circleLayer.fillColor = UIColor.clear.cgColor //背景顏色

(三)將繪製一個進度條的部分宣告為func

func createTask(startDegree:CGFloat , percentage:CGFloat , color:UIColor) -> CAShapeLayer{

let percentagePath = UIBezierPath(arcCenter: CGPoint(x: lineWidth + radius, y: lineWidth + radius), radius: radius, startAngle: aDegree * startDegree, endAngle: aDegree * (startDegree + 360 * percentage / 100), clockwise: true)

let percentageLayer = CAShapeLayer()

percentageLayer.path = percentagePath.cgPath

percentageLayer.strokeColor = color.cgColor

percentageLayer.lineWidth = lineWidth

percentageLayer.fillColor = UIColor.clear.cgColor

return percentageLayer

}

(四) 證券百分比,26%

//第一個證券

let start1:CGFloat = 270 //起始點

let stock1: CGFloat = 26 //百分比

let color1: UIColor = UIColor(red: 64/255, green: 113/255, blue: 189/255 , alpha: 1)

let percentageLayer = createTask(startDegree:start1,percentage: stock1 , color:color1)

//第二個證券

let start2:CGFloat = (270 + 360 * stock1 / 100)

let stock2: CGFloat = 26

let color2: UIColor = UIColor(red: 128/255, green: 208/255, blue: 218/255 , alpha: 1)

let percentageLayer2 = createTask(startDegree:start2,percentage: stock2 , color:color2)

(五)將這些Layer加入到View

view.layer.addSublayer(circleLayer)

view.layer.addSublayer(percentageLayer)

view.layer.addSublayer(percentageLayer2)

view.layer.addSublayer(percentageLayer3)

view.layer.addSublayer(percentageLayer4)

view.layer.addSublayer(percentageLayer5)

使用Xcode Project來製作App畫面

(一)建立一個ImageView當作背景圖。

(二)建立一個View,放置於畫面,並將其底設定為白色,並增加參數layer.cornerRadius來增加此View的圓角。

(三)使用Label建立相關文字顯示部分,如:證券資產、我的資產、各大證券分佈文字與百分比。

(四)新增一個UIButton來放置於下方,以用來顯示詳細資料。

(五)最後空白區域擺放集保e存摺的廣告。

(六)搭配TabController就可以出現Tab Item。

(七)圖表部分則在上方新增一個ImageView先不預設任何圖樣。

加入Playground的程式

點選ViewController.swift檔案,並於viewDidLoad中加入剛剛所在Playground寫的程式。並將ImageView透過Outlet的方式加入至ViewController.swift變成物件並命名為imageChart。

將之前所做的View取消掉,改使用imageChart

增加totalMoneyLabel,並將做出來的Layer都加入到這個imageView,剛放入執行時可能會發生位置與大小不太對導致顯示不正常,這時只需要修改我們一開始所規劃的常數,這樣顯示就會正常。

成果分享

Github

--

--