2012年5月27日日曜日

iOSで時計アプリを作る

GW中にゴソゴソつくっていた、iPad用時計アプリ 時計&カレンダー Desk Clock Calendar がもうすぐ公開される予定です!
仕事中でパソコンに向かっている時、眠っているiPadを有効に使いたいー と思い作ってみました。
今週、今月、今年で、もう何%過ぎてしまったか? のグラフ見れる、焦る機能付きですw

多分、プロモコードの配布とかすると思うので、興味有る方は是非。

時計では 時間の表示 をします。
時間を表示って、結構いろんなアプリで表示が必要になりますけど、誰もが一度は多分経験するだろうハマリ箇所をご紹介。

時間の表示は、NSDateFormatterを使ってフォーマットして表示します。
NSDateFormatterはOS側のLocaleの設定や、24時間表示 on/off の設定によって挙動が変わってしまうの注意!

たとえば、以下のように表示設定をするとする。
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy/MM/dd HH:mm:ss"];
NSDate *date = [NSDate date];
NSLog(@"date %@", [formatter stringFromDate:date]);

HHは、24時間表示の設定なので、

2012/05/27 15:22:50

のような24時間表示の結果を期待するのですが、これが、表示が何もされなくなったり、12時間表示になったり というパターンになる時があります。
その時は、OS側の設定で 設定 → 一般 → 日付と時刻 で 24時間表示 が off になっている時に発生します。
逆に 24時間表示が on になっている時に、hh(12時間表示)のフォーマットにしてもNG。

解決策としては、NSDateFormatterにLocaleを設定してあげること。
[formatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"ja_JP"] autorelease]];

ちなみに、
[formatter setLocale:[NSLocale currentLocale]];
では上手く反応してくれなくて解決になりませんw
国際化しているアプリでは気持ち悪いデスヨネ...
Localeがjaだと 5月と表示されるが、enだと May となったりもするので、そのコードにjaのLocaleを単純にいれてよいのか?はちゃんと確認が必要です。

逆に考えると、OSの設定が引き継がれるので、自分のアプリで設定項目を作らなくてもよかったりする場面もあるかも。
表示される文字の長さに注意して、画面レイアウトすれば... ですけども。

今回作成したアプリでは、時間はキモのところであり、経過時間などの計算もしたりするので、 NSDateFormatterでのフォーマットを使っている所もあるのですが、NSDateComponentを使ってNSDateの情報を抽出して自分でフォーマットしている所の方が多いw
NSDateComponent は、NSDateを年/月/日/曜日 などに分割してくれるものですが、NSCalendarと一緒に組み合わせて使うと、 経過日数の算出とか、今月の日数の算出とかできます。

まとめると....
日付を表示するアプリを作る場合は、複数のテスト端末を用意して、24/12時間表示の設定が違うもの、Localeが日本と日本以外で違うもの を用意する。さらに言語設定が違うものも揃えとくと吉。
というお話でした。

• • •