概要

BMI Dial(BMIダイヤル) は、円形のダイヤルを回して使う iOS 向けの BMI 計算アプリです。

中央の円は身長・体重・BMI の3項目に分かれていて、指で回すと「上に来た項目」が自動で算出されます。 残りの2つを入力するだけ、という操作系にすることで、「どれを求めたいか」をダイヤルの向きで直感的に切り替えられます。 健康管理層・トレーニーを対象に、シンプルで美しい UI を目指しました。

広告なし・データ収集なしで、入力はすべて端末内で完結します。現在 App Store リリースに向けて準備中(v1.0) です。

本アプリの数値・判定は一般的な情報提供を目的としたもので、医療上の助言に代わるものではありません。

主な機能

  • 回して算出 — 中央のダイヤルを回し、上に来た項目(身長・体重・BMI)を残り2つから自動計算
  • JASSO 基準の判定 — 日本肥満学会(JASSO)基準による判定と、適正体重の表示
  • 目標体重インサイト — 目標体重までの増減がひと目でわかる
  • 単位切替 — メートル法/ヤード・ポンド法
  • 3つのテーマ — ふんわりパステル/モノ・ミニマル/ダークモード
  • 日本語・英語対応

プライバシー

  • 広告なし・データ収集なし — 解析も広告 SDK も入れていません
  • 入力データはすべて端末内で完結し、外部に送信されません(App Privacy: データ収集なし)

技術構成

  • SwiftUI(iOS 18+)で実装
  • MVVM — 計算ロジックを BMIViewModel に分離
  • ダイヤルの描画・操作は Canvas / GeometryReader / DragGesture を使用
  • ローカライズ(日本語・英語)
  • ユニットテスト(XCTest) — 計算ロジック(BMIViewModel / 単位変換 Units)をテスト
  • GitHub Actions による CI — macOS ランナー上で xcodebuild test を実行し、コードカバレッジを計測

設計メモ

  • ダイヤルの幾何 — 直径 300pt の円を3セクター(各 120°)に分割し、conic-gradient で描画。各項目ラベルは中心から半径 104pt のリング上に配置。
  • 回転とスナップ — ドラッグ中はポインタ角度(atan2)の差分でホイール全体を回転させ、指を離すと最寄りの 120°の倍数へスナップ(280ms / easeOutCubic)。スナップ確定後に算出対象を再判定して再計算する。
  • 算出対象の判定 — 回転角から「上部に来ているセクター」を求め、その項目を自動算出扱いにする。
  • 広告なし方針 — v1.0 はプライバシー申告を「データ収集なし」で完結させるため、広告 SDK を外して出荷。広告コードは #if canImport(GoogleMobileAds) でガードしたまま残してあり、将来 SDK を戻すだけで再有効化できる設計にしている。