iOS Swift グラフの表示とヘルスデータの取得ができるようになったので、ヘルスデータ(体重)のグラフを作成してみる
グラフの表示とヘルスデータの取得ができるようになったので、ヘルスデータ(体重)のグラフを作成してみる。
サンプルソース
グラフの期間など課題。
X軸のラベルは、self.lineChartView.xAxis.valueFormatter に インデックスを文字列に変換する辞書をわたす。
import HealthKit import UIKit import Charts import TinyConstraints class BodyMassViewController: UIViewController { lazy var lineChartView: LineChartView = { let charView = LineChartView() charView.backgroundColor = .white charView.animate(yAxisDuration: 1.5) return charView }() var healthStore : HKHealthStore? override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. if HKHealthStore.isHealthDataAvailable() { healthStore = HKHealthStore() } view.addSubview(lineChartView) lineChartView.centerInSuperview() lineChartView.width(to: view) lineChartView.heightToWidth(of: view) setData() } func setData() { let start = Calendar.current.date(byAdding: .month, value: -48, to: Date()) let end = Date() let predicate = HKQuery.predicateForSamples(withStart: start, end: end) let sampleType = HKQuantityType.quantityType(forIdentifier: .bodyMass)! let query = HKSampleQuery( sampleType: sampleType, predicate: predicate, limit: HKObjectQueryNoLimit, sortDescriptors: nil) { (query, results, error) in let samples = results as! [HKQuantitySample] var yValues: [ChartDataEntry] = [] var xValues: [String] = [] var x = 0.0 let formatter = DateFormatter() formatter.dateFormat = "yy/M/d" for sample in samples { let y = sample.quantity.doubleValue(for: .gram()) / 1000 let ds = ChartDataEntry(x: x, y: y) yValues.append(ds) xValues.append(formatter.string(from: sample.startDate)) x += 1 } DispatchQueue.main.async { let set1 = LineChartDataSet(entries: yValues, label: "BodyMass") let data = LineChartData(dataSet: set1) self.lineChartView.data = data self.lineChartView.xAxis.valueFormatter = IndexAxisValueFormatter(values: xValues) } } self.healthStore?.execute(query) } @IBAction func onDismiss(_ sender: Any) { self.navigationController?.dismiss(animated: true) } }