ダイエットの為のiPhoneアプリを作ったはなし

この記事はGeek Women Advent Calendar 2015の24日目の記事です。
はじめまして。市村です。iOS, Android系の開発をしています。
Advent Calendarを書くのは初めてでドキドキですが、書かせていただいてありがとうございます!

社会人になってから10年くらい経つのですが、10キロくらい体重が増えてしまいました。
ずーっとダイエットしているのですが、まったく減量できません。

やっぱり日々自分がどのくらい増量していっているのか把握した方がいいよなーという事で、
体重をグラフ表示するアプリを作ってみました。
毎朝基礎体温を測っているんですが、それもついでに保存しちゃいます。

データ入力画面はこんな感じにしました。
Segmented Controlで体重と体温の入力を切り替えます。
ものぐさなので、これ以上はシンプルにできないだろうというUIにしました。
f:id:ichimuratan:20151223232008p:plain

データの保存はRealmを使いました。
pod installして今回データを保存するMyDataテーブルを作ります。

#import <Realm/Realm.h>

@interface MyData : RLMObject
@property NSInteger year; // 年
@property NSInteger month; // 月
@property NSInteger day; // 日
@property NSString* yobi; // 曜日
@property float mData; // データ
@property NSInteger index; // データの種類 体重:0 体温:1

@end

// This protocol enables typed collections. i.e.:
// RLMArray<MyData>
RLM_ARRAY_TYPE(MyData)

UITextViewから取得した値をこんな感じで保存していきます。

RLMRealm *realm = [RLMRealm defaultRealm];
[realm beginWriteTransaction];
MyData *myData = [[MyData alloc]init];
myData.mData = self.inputData.text.floatValue;
myData.index = index;
myData.year = year;
myData.month = month;
myData.day = day;
myData.yobi = yobi;
[realm addObject:myData];
[realm commitWriteTransaction];

保存したデータを取得する時はこうです。

NSPredicate *pred = [NSPredicate predicateWithFormat:@"year = %d AND month = %d AND index = 0", self.mYear , self.mMonth ];
RLMResults *datas = [MyData objectsWithPredicate:pred];
// RLMResultsは該当データの配列でMyData* data = [datas objectAtIndex:i];のようにデータが取得できます。

Realmは簡単にデータ保存ができて、素晴らしかったです。
ただ、limitがなかったので、個人的にはlimitもあるといいなーと思いました(何か理由があるのかもしれませんが)。
グラフ描画はUIBezierPathを使って行います。

#import "LineDrawer.h"

@implementation LineDrawer

-(bool)draw{
    UIBezierPath *line = [UIBezierPath bezierPath];
    [line moveToPoint:CGPointMake(self.x1, self.y1)];
    [line addLineToPoint:CGPointMake(self.x2, self.y2)];
    [self.color setStroke];
    line.lineWidth = self.lineWidth;
    [line stroke];
    return true;
}
@end

後は、データを座標に変換するクラス、ラインを引くクラス、点を表示するクラス等を作っていって、
Realmで保存したデータをグラフ化すると、こんな感じになりました(データはサンプルです)。
f:id:ichimuratan:20151223233542p:plain
グラフだけだと、日々の移り変わりは分かりますが、実際何キロなのか分かりずらかったので、詳細ボタンを押したらテーブル表示するようにしました(データはサンプルです)。
f:id:ichimuratan:20151223234305p:plain
テーブルもUIBezierPathで書きました。何か別の方法があったんじゃないかと思います。。。
アイコンも作ってみました。アプリと何の関係も無いデザインですが、まあいいかと。
アプリの名前はなんとなくMeにしました。
f:id:ichimuratan:20151224000321p:plain
自分のiPhoneに自分のアプリのアイコンがあるのはちょっと嬉しいです。
後は、毎日体重を計るだけ♩自分の意思次第ですね。
仕事とは別に、自分の欲しいアプリを作るのは楽しいですねー。
自分が使い易いように設計できるし、ウキウキしました。
クラスの設計とかも、ああやれば良かったなーとか色々ありますが、それも勉強になりました。
エンジニアやってるとデスクワークだし運動不足になりがちですが、あんまり太りすぎるのも良くないと思うので、もう少し自分の体に関心を持って過ごしたいなーと思います。
おしまい。
ichimurayukie/iOSHealthApp · GitHub