10YearChallenge — 2010~2020 台灣人口曲線
Published in
7 min readJun 5, 2020
目的:整合 date Picker、slider、switch、timer、UIBezierPath 應用。
實際運作:
程式碼與註解:
import UIKitclass ViewController: UIViewController { @IBOutlet weak var peopleLabel: UILabel!
@IBOutlet weak var showView: UIView!
@IBOutlet weak var yearLabel: UILabel!
@IBOutlet weak var slider: UISlider!
@IBOutlet weak var datePicker: UIDatePicker!
// 2010~2020 台灣人口(萬)
let taiwanPeople = [2316,2322,2331,2337,2343,2349,2353,2357,2358,2360,2359]
// 計時器
var timer = Timer()
// 初始年份
var year = 2010
let shapeLayer = CAShapeLayer()override func viewDidLoad() {
super.viewDidLoad()
peopleLabel.text = "總人口數(萬): \(taiwanPeople[0])"
// 預設datePicker的時間
let dateComponents = DateComponents(calendar: Calendar.current, year: year, month: 06, day: 02, hour: 00, minute: 00, second: 00)let date = dateComponents.date
datePicker.date = date!
// datePicker顯示格式(可直接於StoryBoard設定)
datePicker.datePickerMode = .date
// 人口曲線繪製
drawLine()
}
func drawLine() {
let yearSelect = year - 2010
let path = UIBezierPath()
peopleLabel.text = "總人口數(萬): \(taiwanPeople[yearSelect])"
// 移除之前畫的曲線
shapeLayer.removeFromSuperlayer()
// 開始繪製曲線
path.move(to: CGPoint(x: 0, y: 259))
path.addLine(to: CGPoint(x: 1, y: 259))
for i in 0...yearSelect {
path.addLine(to: CGPoint(x: ((i + 1) * 30), y: 260 - (taiwanPeople[i] - 2316) * 5))
}
shapeLayer.path = path.cgPath
shapeLayer.strokeColor = UIColor.blue.cgColor
shapeLayer.lineWidth = 5
shapeLayer.fillColor = UIColor.clear.cgColor
showView.layer.addSublayer(shapeLayer)
}
// 自動計時器重複執行內容
@objc func timerAction() {
if year < 2020 {
year = year + 1
} else {
year = 2010
}
// 更改Label
yearLabel.text = "\(year)"
// 更改Slider(需轉為Float)
slider.value = Float(year)
// 更改datePicker時間
let dateComponents = DateComponents(calendar: Calendar.current, year: year, month: 06, day: 02, hour: 00, minute: 00, second: 00)
let date = dateComponents.date
datePicker.date = date!
// 人口曲線繪製
drawLine()
}// datePicker 切換
@IBAction func datePickerSelect(_ sender: UIDatePicker) {
// 設置要顯示在 UILabel 的日期時間格式
let formatter = DateFormatter()
formatter.dateFormat = "yyyy"
// 更改Label
yearLabel.text = formatter.string(from: datePicker.date)
// 取得所選的年份
let imageYear = datePicker.date
let dateComponents = Calendar.current.dateComponents(in: TimeZone.current, from: imageYear)
let datePickerYear = dateComponents.year!
year = datePickerYear
// 更改Slider(需轉為Float)
slider.value = Float(year)// 人口曲線繪製
drawLine()
}
// Slider 切換
@IBAction func sliderChange(_ sender: UISlider) {
year = Int(sender.value)
// 更改Label
yearLabel.text = "\(year)"
// 更改datePicker時間
let dateComponents = DateComponents(calendar: Calendar.current, year: year, month: 06, day: 02, hour: 00, minute: 00, second: 00)
let date = dateComponents.date
datePicker.date = date!
// 人口曲線繪製
drawLine()
}
@IBAction func switchChange(_ sender: UISwitch) {
if sender.isOn {
// 啟動計時器
timer = Timer.scheduledTimer(timeInterval: 0.5, target: self, selector: #selector(timerAction), userInfo: nil, repeats: true)
} else {
// 關閉計時器
timer.invalidate()
}
}
}
GitHub: