iOS Swift グラフの表示とヘルスデータの取得ができるようになったので、ヘルスデータ(体重)のグラフを作成してみる

グラフの表示とヘルスデータの取得ができるようになったので、ヘルスデータ(体重)のグラフを作成してみる。

healthkit_chart

healthkit_charts

サンプルソース

グラフの期間など課題。

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

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です