実機テスト推奨です。
Contents 非表示
実装
Altimator.swift
import CoreMotion
final class Altimator {
var altimeter: CMAltimeter?
init() {
altimeter = CMAltimeter()
}
func startUpdate(completion: @escaping (Double) -> Void) {
guard let altimeter = altimeter else {
return
}
if CMAltimeter.isRelativeAltitudeAvailable() {
altimeter.startRelativeAltitudeUpdates(to: OperationQueue.main) { data, error in
if error == nil {
guard let pressure = data?.pressure.doubleValue else {
return
}
print("気圧", pressure * 10)
completion(pressure * 10)
} else {
// Handle error here
}
}
}
}
func stopUpdate() {
altimeter?.stopRelativeAltitudeUpdates()
}
}
HomeView.swift (メインのView)
import SwiftUI
import CoreMotion
struct HomeView: View {
private let altimator = Altimator()
@State var pressureValue = 0.0
var body: some View {
VStack {
Text(String(format: "%.2f", pressureValue))
.font(.largeTitle)
Text("hPa")
.font(.title)
.fontWeight(.semibold)
startButton
stopButton
}
}
private var startButton: some View {
Button {
altimator.startUpdate { value in
self.pressureValue = value
}
} label: {
Text("測定開始")
}
.font(.custom(FontFamily.Caprasimo.regular, size: 24))
.frame(width: UIScreen.main.bounds.width / 1.3, height: UIScreen.main.bounds.height / 28, alignment: .center)
.padding()
.foregroundColor(.white)
.background(.orange)
.padding()
}
private var stopButton: some View {
Button {
altimator.stopUpdate()
} label: {
Text("測定終了")
}
.font(.custom(FontFamily.Caprasimo.regular, size: 24))
.frame(width: UIScreen.main.bounds.width / 1.3, height: UIScreen.main.bounds.height / 28, alignment: .center)
.padding()
.foregroundColor(.white)
.background(.gray)
.padding()
}
}