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)
}
}



