林信行さんによるコラム「Apple's Eye」No.238 で、ユーザのつぶやきをタイムラインで表示するサービス、Twitterが話題に挙げられています。
このコラムが連載されているmactopiaは Microsoft 運営の、Office などの Mac 向け製品のサポートサイトですが、「Apple's Eye」は幅広く Mac/Apple や IT関連の話題を扱っていて、興味深い内容となっています。今回の Twitter の話題も、iPhone / iPod touch 活用の一例と考えられます。
自分も、少し前から 夏ライオン や TwitterFon を利用しています。
元々は、iphone_dev_jp の情報を得たいと思って始めたので、自分からの発信はあまりしてきませんでしたが、せっかくなので、これからもっと活用していこうかとも思っています。
2009年04月19日
2009年04月13日
iPhone SDKの教科書
赤松正行さんの「iPhone SDKの教科書」(秀和システム刊)を買いました。教科書という名にふさわしい、これから iPhone アプリの開発をはじめる人にとっても良い道標になる本だと思いました。
iPhone アプリ開発の解説書も増えてきましたが、この本の特色は、SDKやフレームワークの網羅的な説明ではなく、とにかくアプリケーションを作る楽しさを感じとれるようになっているところ。ソースコードも少なく、iPhone というデバイスで何ができるか、そのためにどうするか、という実践的な話が多くなされています。
もちろん、必要最小限の前提知識として、オブジェクト指向言語の概念や開発環境についても解説されているので、これ一冊でも、傍らに置いてアプリを作り始められると思います。
Xcode については、リファクタリングやスナップショットといった機能についても触れられていて、実際の開発を意識した解説になっているように思います。
同じプロジェクトを使い続けていくと、リファクタリング機能はとても有用になってくるので、このブログでもいずれ取り上げたいと思います。
また、巻末には、アプリのグラフィックデザインを担当された方のコラムが附録されているのも画期的だと思います。
iPhone アプリは一人でも作れますが、デザイナでない人間にとってアイコン一つ作るのにも苦労するものです。
また、デザインという言葉は本当は単なる見栄えの良さだけではなく、機能的なものも含めた設計のことを指します。iPhone というマルチタッチデバイスの上では、これまでとは違う機能性も求められることになります。
そういった意味で、デザイナの視点から、iPhone アプリにとって本当に「良いデザイン」とは何か、それをより深く考えられる章になっています。
iPhone のみならず、Mac OS X も含めた Cocoa / Cocoa touch というフレームワークの中で、こういった良質な本が出版される今の状況はとても幸せなことだと思います。
自分が数年前、Cocoa プログラミングを始めた際には、Cocoa アプリの解説書は数少ない状況でした。木下誠さんのHMDT本も第2版が品切れ状態で、今でも最高のCocoa本の一つだと思っている「たのしいCocoaプログラミング」も未発売の頃でした。
最終的にはプログラミングは自分の手で憶えるものという考えもあるとは思いますが、良き指南書があるかないかでは、その過程も違ってくるでしょう。
今後もこういった書籍を通して、iPhone アプリ開発の楽しさを知る人がより多くなることを期待します。
iPhone アプリ開発の解説書も増えてきましたが、この本の特色は、SDKやフレームワークの網羅的な説明ではなく、とにかくアプリケーションを作る楽しさを感じとれるようになっているところ。ソースコードも少なく、iPhone というデバイスで何ができるか、そのためにどうするか、という実践的な話が多くなされています。
もちろん、必要最小限の前提知識として、オブジェクト指向言語の概念や開発環境についても解説されているので、これ一冊でも、傍らに置いてアプリを作り始められると思います。
Xcode については、リファクタリングやスナップショットといった機能についても触れられていて、実際の開発を意識した解説になっているように思います。
同じプロジェクトを使い続けていくと、リファクタリング機能はとても有用になってくるので、このブログでもいずれ取り上げたいと思います。
また、巻末には、アプリのグラフィックデザインを担当された方のコラムが附録されているのも画期的だと思います。
iPhone アプリは一人でも作れますが、デザイナでない人間にとってアイコン一つ作るのにも苦労するものです。
また、デザインという言葉は本当は単なる見栄えの良さだけではなく、機能的なものも含めた設計のことを指します。iPhone というマルチタッチデバイスの上では、これまでとは違う機能性も求められることになります。
そういった意味で、デザイナの視点から、iPhone アプリにとって本当に「良いデザイン」とは何か、それをより深く考えられる章になっています。
iPhone のみならず、Mac OS X も含めた Cocoa / Cocoa touch というフレームワークの中で、こういった良質な本が出版される今の状況はとても幸せなことだと思います。
自分が数年前、Cocoa プログラミングを始めた際には、Cocoa アプリの解説書は数少ない状況でした。木下誠さんのHMDT本も第2版が品切れ状態で、今でも最高のCocoa本の一つだと思っている「たのしいCocoaプログラミング」も未発売の頃でした。
最終的にはプログラミングは自分の手で憶えるものという考えもあるとは思いますが、良き指南書があるかないかでは、その過程も違ってくるでしょう。
今後もこういった書籍を通して、iPhone アプリ開発の楽しさを知る人がより多くなることを期待します。
2009年04月02日
全世界の iTunes Store ランキングを表示する iTunes Store Charts
Apple のウェブサイトで、世界各国の iTunes Store のランキングを一覧で表示できる iTunes Store Charts が公開されています。
App Store でのジャンル別のアプリのランキングも表示できます。壮観なのは、2009年4月2日現在、ほとんどの国で Skype が1位になっている Top 10 フリーアプリ。

また、ジャンル別ランキングでは、国ごとに違った顔ぶれになっていて面白いです。普段とは違う視点でアプリを探すのに役立つのはもちろん、開発者にとってもいろいろなヒントが得られそうです。
人気が高いのは、その国の法人・個人が開発しているアプリ、ローカライズに対応しているアプリであると想像できますが、それと同時に国柄も反映されているようにも思えてきます。
アプリ名だけからの類推ですが、写真カテゴリでは、日本は他の国に比べてもカメラアプリの人気が高そう、といった具合に。
他の国のランキングに表示されているアプリでも、日本で発売されていれば iTunes でダウンロードすることができます。ただし、他の国で1位でも、日本で購入できないアプリもあって、残念なときもあります。
個人的な思いとしては、どうしても特定の国でしかサービスを提供できないアプリでない限り、どの国でもダウンロードできるようにしてほしいです。それによって、App Store という市場の可能性を最大限に活かせるのではないかと思います。
自分の開発した BookRemark も、日本以外はほとんど広報活動をしていないのですが、アメリカやイギリスでも好意的なレビューがついて、それなりにダウンロード数があります。ローカライズにも対応していない英語圏以外の国でも、わずかにダウンロードされていて、App Store が世界に広がっていることを実感します。
App Store でのジャンル別のアプリのランキングも表示できます。壮観なのは、2009年4月2日現在、ほとんどの国で Skype が1位になっている Top 10 フリーアプリ。

また、ジャンル別ランキングでは、国ごとに違った顔ぶれになっていて面白いです。普段とは違う視点でアプリを探すのに役立つのはもちろん、開発者にとってもいろいろなヒントが得られそうです。
人気が高いのは、その国の法人・個人が開発しているアプリ、ローカライズに対応しているアプリであると想像できますが、それと同時に国柄も反映されているようにも思えてきます。
アプリ名だけからの類推ですが、写真カテゴリでは、日本は他の国に比べてもカメラアプリの人気が高そう、といった具合に。
他の国のランキングに表示されているアプリでも、日本で発売されていれば iTunes でダウンロードすることができます。ただし、他の国で1位でも、日本で購入できないアプリもあって、残念なときもあります。
個人的な思いとしては、どうしても特定の国でしかサービスを提供できないアプリでない限り、どの国でもダウンロードできるようにしてほしいです。それによって、App Store という市場の可能性を最大限に活かせるのではないかと思います。
自分の開発した BookRemark も、日本以外はほとんど広報活動をしていないのですが、アメリカやイギリスでも好意的なレビューがついて、それなりにダウンロード数があります。ローカライズにも対応していない英語圏以外の国でも、わずかにダウンロードされていて、App Store が世界に広がっていることを実感します。
2009年03月28日
BookRemark 1.1 をリリースしました
BookRemark のバージョン1.1 がApp Store に公開されました。
今回のバージョンアップでは、最初のリリースで手が回らなかった部分の改善と、レビューやTrackBackでいただいた要望の一部を反映しました。
自分一人では思いつかなかった機能・使い方の提案をユーザから直接聴けるのが、 App Store という仕組みの面白いところだと実感しています。
最も大きく変わったのは「設定」タブでの表示。設定可能項目が増えてきたので、Table View にしました。

Remark では従来通り購入済の本を表示するかどうかの設定に加え、発売日の新しい順に表示するか、古い順に表示するかを設定可能にしています。

同様に著者別表示でも、未購入の本を表示するかどうか設定可能にしました。未購入の本を表示しないことで、より純粋な蔵書管理としての使い方ができるかと思います。
もうひとつ大きな変更点は、Amazon で本を注文する際の操作性の向上です。
これまで、カートボタンをタップすると、アプリを終了し Safari を起動していましたが、WebView を使ってアプリ内部で表示するようにしました。
また、表示するページも、iPhone / iPod touch 用のページに変更し、より使いやすくなりました。

著者別表示の改善点としては、同じ著者の本をタイトル順に並べるようにしました。これで、漫画やライトノベルのように、シリーズで刊行される本も正しく並ぶようになったと思います。
ただし、たまに Amazon に登録されているタイトル名が不揃いで、うまく並ばないときもあります。その場合は手動でタイトルを編集してください。

また、同じ著者や関連書籍の検索も修正しています。Navigation View 化することにより、何か本を選択して保存した後に、元の検索結果に戻るようにしました。これで、既に持っている同じ著者の本を続けて保存していくことができるようになりました。

その他の要望につきましても、できる限り今後のバージョンアップで検討予定です。(少し UI を再検討する必要があるので、後回しにさせていただきました)
今回のバージョンアップでは、最初のリリースで手が回らなかった部分の改善と、レビューやTrackBackでいただいた要望の一部を反映しました。
自分一人では思いつかなかった機能・使い方の提案をユーザから直接聴けるのが、 App Store という仕組みの面白いところだと実感しています。
最も大きく変わったのは「設定」タブでの表示。設定可能項目が増えてきたので、Table View にしました。

Remark では従来通り購入済の本を表示するかどうかの設定に加え、発売日の新しい順に表示するか、古い順に表示するかを設定可能にしています。

同様に著者別表示でも、未購入の本を表示するかどうか設定可能にしました。未購入の本を表示しないことで、より純粋な蔵書管理としての使い方ができるかと思います。
もうひとつ大きな変更点は、Amazon で本を注文する際の操作性の向上です。
これまで、カートボタンをタップすると、アプリを終了し Safari を起動していましたが、WebView を使ってアプリ内部で表示するようにしました。
また、表示するページも、iPhone / iPod touch 用のページに変更し、より使いやすくなりました。

著者別表示の改善点としては、同じ著者の本をタイトル順に並べるようにしました。これで、漫画やライトノベルのように、シリーズで刊行される本も正しく並ぶようになったと思います。
ただし、たまに Amazon に登録されているタイトル名が不揃いで、うまく並ばないときもあります。その場合は手動でタイトルを編集してください。

また、同じ著者や関連書籍の検索も修正しています。Navigation View 化することにより、何か本を選択して保存した後に、元の検索結果に戻るようにしました。これで、既に持っている同じ著者の本を続けて保存していくことができるようになりました。

その他の要望につきましても、できる限り今後のバージョンアップで検討予定です。(少し UI を再検討する必要があるので、後回しにさせていただきました)
2009年03月19日
ウィルコム「どこでもWi-Fi」を購入しました
巷では iPhone OS 3.0 の話題で持ちきりですが、今回はまったく関係のない話。
(なお、iPhone OS 3.0 は NDA のため、しばらく詳しい内容は触れられません)
ウィルコムが今月発売を開始した、「どこでもWi-Fi」。ようやく店頭で見つけたので、購入しました。
この機器は、ウィルコムのPHS網を通じて、無線LANアクセスポイントを構築できるものです。ウィルコムのサービスエリア内であれば、iPod touch を iPhone のようにいつでもインターネットにつなげることができます。本体の開発はバッファロー社が行っているようです。

製品には eneloop が付属し、単三x4 で駆動します。(ACアダプタも利用可能)
偶然か故意か、本体の高さや幅は iPhone / iPod touch とちょうど同じくらいです。さすがに厚みは数倍ですが。
認証は本体に印字されている SSID と KEY を用います。その後の細かい設定は、通常のブロードバンドルータと同様、Web ブラウザで設定画面にアクセスします。
公式サイトやパンフレットでは、接続に必要な PC環境が「Windows Vista/XP」と不思議なことが書いてありますが、Mac OS X や iPhone / iPod touch 上の Safari でもまったく問題ありません。特別なドライバなどのインストールも不要です。せっかく使用例として iPod touch を挙げているのに、Mac ユーザに対するアピールがやや不足しているような気がします。

インターネットへの接続速度ですが、個々のアプリで随時ネットワークから情報を取得するレベルならほぼ問題ないと感じました。
料金は定額で3880円/月。新規加入時の割引で、2年間は実質1980円/月となります。自分のように電話をあまり使わない人には、この「どこでもWi-Fi」と iPod touch の組み合わせが、 iPhone の有力な代替手段になるのではないかと思います。
(なお、iPhone OS 3.0 は NDA のため、しばらく詳しい内容は触れられません)
ウィルコムが今月発売を開始した、「どこでもWi-Fi」。ようやく店頭で見つけたので、購入しました。
この機器は、ウィルコムのPHS網を通じて、無線LANアクセスポイントを構築できるものです。ウィルコムのサービスエリア内であれば、iPod touch を iPhone のようにいつでもインターネットにつなげることができます。本体の開発はバッファロー社が行っているようです。

製品には eneloop が付属し、単三x4 で駆動します。(ACアダプタも利用可能)
偶然か故意か、本体の高さや幅は iPhone / iPod touch とちょうど同じくらいです。さすがに厚みは数倍ですが。
認証は本体に印字されている SSID と KEY を用います。その後の細かい設定は、通常のブロードバンドルータと同様、Web ブラウザで設定画面にアクセスします。
公式サイトやパンフレットでは、接続に必要な PC環境が「Windows Vista/XP」と不思議なことが書いてありますが、Mac OS X や iPhone / iPod touch 上の Safari でもまったく問題ありません。特別なドライバなどのインストールも不要です。せっかく使用例として iPod touch を挙げているのに、Mac ユーザに対するアピールがやや不足しているような気がします。

インターネットへの接続速度ですが、個々のアプリで随時ネットワークから情報を取得するレベルならほぼ問題ないと感じました。
料金は定額で3880円/月。新規加入時の割引で、2年間は実質1980円/月となります。自分のように電話をあまり使わない人には、この「どこでもWi-Fi」と iPod touch の組み合わせが、 iPhone の有力な代替手段になるのではないかと思います。
2009年03月16日
ネットワークの接続エラーを表示する
App Store でアプリケーションをリリースする場合、Apple による審査を受ける必要があります。その際の審査基準として、Wi-Fi や 3G のネットワークに接続して情報を取得するアプリの場合、接続エラーが起こった場合にアラートを出すなどの処理を行わなければならない、というものがあります。
現在ネットワークが利用可能かどうかを問い合わせるAPIもありますが、BookRemark では、まず NSURLConnection で通信を試み、エラーが返ってきたらアラートを出すという方法を採っています。今のところ、これで審査は通っています。
NSURLConnection での情報の取得は、以前の記事を参考にしてください。
前回は接続が正常に終了した場合を想定して、connectionDidFinishLoading: のみ実装しましたが、エラーが起こった場合には、このメソッドの代わりに -connection:didFailWithError: が呼ばれます。
呼び出し元のメソッドにエラーが起こったことを通知するために、今回も Notification を用います。ただし、今回は、userInfo に、エラーの中身を含めておきます。
正常終了の場合と比較してみましょう。
Notification Name を合わせておくことで、接続エラーの場合も、前回のように正常に接続できたときと同じメソッドが呼ばれます。
追加した引数 userInfo には、NSDictionary の形で、任意のデータを含めることができます。異なるオブジェクト間で、データをやりとりするのに使えます。
通知を受け取った側では、 NSNotification の -userInfo メソッドで取得できます。これが nil でない場合、接続エラーだと判断できます。
userInfo から NSError を取り出したら、-localizedDescription メソッドで、エラーの内容を現在の言語環境で取得できます。
これを日本語環境、英語環境のそれぞれで実行してみると、以下のようになります。
(タイトル部分のみアプリケーション内で翻訳を用意しています)

接続エラーだけでなく、サーバが見つからないなどのエラーも、NSError を使って表示させることができます。
現在ネットワークが利用可能かどうかを問い合わせるAPIもありますが、BookRemark では、まず NSURLConnection で通信を試み、エラーが返ってきたらアラートを出すという方法を採っています。今のところ、これで審査は通っています。
NSURLConnection での情報の取得は、以前の記事を参考にしてください。
前回は接続が正常に終了した場合を想定して、connectionDidFinishLoading: のみ実装しましたが、エラーが起こった場合には、このメソッドの代わりに -connection:didFailWithError: が呼ばれます。
呼び出し元のメソッドにエラーが起こったことを通知するために、今回も Notification を用います。ただし、今回は、userInfo に、エラーの中身を含めておきます。
- (void)connection:(NSURLConnection *)connection
didFailWithError:(NSError *)error
{
[[NSNotificationCenter defaultCenter]
postNotificationName: @"connectionDidFinishNotification"
object: self
userInfo: [NSDictionary dictionaryWithObject: error
forKey: @"error"]];
}
正常終了の場合と比較してみましょう。
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
[[NSNotificationCenter defaultCenter]
postNotificationName: @"connectionDidFinishNotification"
object: self];
}
Notification Name を合わせておくことで、接続エラーの場合も、前回のように正常に接続できたときと同じメソッドが呼ばれます。
追加した引数 userInfo には、NSDictionary の形で、任意のデータを含めることができます。異なるオブジェクト間で、データをやりとりするのに使えます。
通知を受け取った側では、 NSNotification の -userInfo メソッドで取得できます。これが nil でない場合、接続エラーだと判断できます。
if( [notification userInfo] != nil )
{
NSError *error;
error = (NSError *)[[notification userInfo]
valueForKey: @"error"];
}
userInfo から NSError を取り出したら、-localizedDescription メソッドで、エラーの内容を現在の言語環境で取得できます。
UIAlertView *alertView;
NSString *messageString = [error localizedDescription];
alertView = [[UIAlertView alloc]
initWithTitle: NSLocalizedString(@"Failed to get information.", nil)
message: messageString
delegate: self
cancelButtonTitle: nil
otherButtonTitles: NSLocalizedString(@"OK", nil), nil];
[alertView show];
[alertView release];
これを日本語環境、英語環境のそれぞれで実行してみると、以下のようになります。
(タイトル部分のみアプリケーション内で翻訳を用意しています)

接続エラーだけでなく、サーバが見つからないなどのエラーも、NSError を使って表示させることができます。
2009年03月11日
「ウェザーニュース タッチ」の優れたユーザインタフェースに学ぶ
Weathernews Inc. よりリリースされているiPhone / iPod touch 用アプリ「ウェザーニュース タッチ」を試してみました。
現在は無料ですが、「駅探エクスプレス」同様、将来的に有料になっても、ぜひ引き続き利用したいと思える完成度の高いアプリです。
起動すると、以下のように見慣れた全国の天気が表示されます。

地域検索や、他の気象情報を表示できるタブが使いやすく配置されているのも嬉しいですが、とくに感動的だったのは、よく考えられたアニメーション効果です。
左上の「明日」の文字をタップすると、翌日の天気が表示されます。
このとき、ちょっと文字がタップしづらいかなと思ったのですが、画面が切り替わる際に、ナビゲーションビューの遷移と同じ感覚で、天気のマークが左右にスライドして表示されました。
そこで、もしかしたら、と思い、左右にフリックしてみると、期待通り、今日と明日の天気を切り替えることができました。
また、その下にある「天気」「気温」「風向」をタップすると、マークが上下に回転して切り替わります。
ここまでくれば、学習効果が働きます。思った通り、こちらは上下方向のフリックに対応していました。
優れたアプリケーションというのは、OSで共通して使われる必要最小限の動作さえ憶えておけば、その類推で、はじめて使う場合でもなんとか操作できるものだと思います。(これは iPhone / iPod touch に限らず、Mac OS X 上のアプリにも共通することですが)
その場合にも、どう使うのか、という手がかりをユーザインタフェース上に残す必要があります。
このアプリの場合、ユーザが慣れ親しんだアニメーションによって、ナビゲーションバーや特別なボタンが無くても、画面がフリックできるということを気づかせようとしていて、とても洗練されたユーザインタフェースだと感じました。
現在は無料ですが、「駅探エクスプレス」同様、将来的に有料になっても、ぜひ引き続き利用したいと思える完成度の高いアプリです。
起動すると、以下のように見慣れた全国の天気が表示されます。

地域検索や、他の気象情報を表示できるタブが使いやすく配置されているのも嬉しいですが、とくに感動的だったのは、よく考えられたアニメーション効果です。
左上の「明日」の文字をタップすると、翌日の天気が表示されます。
このとき、ちょっと文字がタップしづらいかなと思ったのですが、画面が切り替わる際に、ナビゲーションビューの遷移と同じ感覚で、天気のマークが左右にスライドして表示されました。
そこで、もしかしたら、と思い、左右にフリックしてみると、期待通り、今日と明日の天気を切り替えることができました。
また、その下にある「天気」「気温」「風向」をタップすると、マークが上下に回転して切り替わります。
ここまでくれば、学習効果が働きます。思った通り、こちらは上下方向のフリックに対応していました。
優れたアプリケーションというのは、OSで共通して使われる必要最小限の動作さえ憶えておけば、その類推で、はじめて使う場合でもなんとか操作できるものだと思います。(これは iPhone / iPod touch に限らず、Mac OS X 上のアプリにも共通することですが)
その場合にも、どう使うのか、という手がかりをユーザインタフェース上に残す必要があります。
このアプリの場合、ユーザが慣れ親しんだアニメーションによって、ナビゲーションバーや特別なボタンが無くても、画面がフリックできるということを気づかせようとしていて、とても洗練されたユーザインタフェースだと感じました。
2009年03月05日
Info.plist からバージョン番号を取得する
アプリケーションの中で、そのアプリについての情報を表示させたい場合があります。Mac OS X (Cocoa アプリ)の場合は「(アプリケーション名)について」というメニューで、自動的に名称とバージョン番号を表示することができるのですが、iPhone アプリでは自作する必要があります。
バージョン番号は Info.plist に記述した「Bundle Version」を参照します。コンテキストメニューから「Show Row Keys/Values」を選択すると、実際は CFBundleVersion をキーとしていることがわかります。

Info.plist に記述した値を取得する専用のメソッドとして、NSBundle の objectForInfoDictionaryKey: が用意されています。引数に CFBundleVersion を指定することでバージョン番号が取得できます。番号といっても実際には文字列(NSString)です。
Info.plist 全体を NSDictionary として取得したい場合は、同じく NSBundle の infoDictionary メソッドを使います。
ちなみに、CFBundleVersion の接頭語「CF」は、Core Foundation を意味します。実際に、Core Foundation で文字列を扱う CFStringRef として kCFBundleVersionKey が定義されています。
CFStringRef は、キャストするだけで NSString として扱えます。つまり、先ほどの処理は以下のように書いても同じです。
Core Foundation についての詳細、Cocoa との関係などは、HMDT の「CoreFoundation の秘密 | HMDT Programming Tips」などが参考になります。
バージョン番号は Info.plist に記述した「Bundle Version」を参照します。コンテキストメニューから「Show Row Keys/Values」を選択すると、実際は CFBundleVersion をキーとしていることがわかります。

Info.plist に記述した値を取得する専用のメソッドとして、NSBundle の objectForInfoDictionaryKey: が用意されています。引数に CFBundleVersion を指定することでバージョン番号が取得できます。番号といっても実際には文字列(NSString)です。
NSString *versionString;
versionString = [[NSBundle mainBundle]
objectForInfoDictionaryKey: @"CFBundleVersion"];
Info.plist 全体を NSDictionary として取得したい場合は、同じく NSBundle の infoDictionary メソッドを使います。
ちなみに、CFBundleVersion の接頭語「CF」は、Core Foundation を意味します。実際に、Core Foundation で文字列を扱う CFStringRef として kCFBundleVersionKey が定義されています。
CFStringRef は、キャストするだけで NSString として扱えます。つまり、先ほどの処理は以下のように書いても同じです。
NSString *versionString;
versionString = [[NSBundle mainBundle]
objectForInfoDictionaryKey: (NSString *)kCFBundleVersionKey];
Core Foundation についての詳細、Cocoa との関係などは、HMDT の「CoreFoundation の秘密 | HMDT Programming Tips」などが参考になります。
2009年02月28日
ナビゲーションバーにタップ可能な画像を表示する
BookRemark では、書誌情報を表示するビューのナビゲーションバーに、表紙画像のサムネイルを表示しています。

これをタップすると、大きな画像が表示されます。
今回は、この実装方法をまとめます。
ナビゲーションバーの表示をカスタマイズするには、 UINavigationItem で操作できます。(UINavigationBar ではないのに注意)
コントローラが UIViewController のサブクラスの場合、navigationItem プロパティで現在のナビゲーションバーを取得できます。
左端に表示したい場合は leftBarButtonItem 、右端に表示したい場合は rightBarButtonItem、中央に表示したい場合は titleView プロパティを使います。ただし、左端には前のビューに戻るためのボタンが自動的に表示されるので注意が必要です。
さて、titleView は名前から推測できるとおり UIView ですが、leftBarButtonItem や rightBarButtonItem は UIBarButtonItem というクラスになっています。表示させたいものに応じて、複数の初期化メソッド(initWith...)が用意されています。
画像を表示させる場合は、initWithImage:style:target:action: が使えます。
image は UIImage で用意しておきます。action は、タップされたときに呼び出されるアクションメソッド、target はそのメソッドの実装されているオブジェクトを指定します。
しかし、このメソッドを使って画像を表示させると、style での指定にかかわらず、常に枠線が表示されてしまいます。また、画像のスケールもされません。

そこで、initWithCustomView: を使うことにします。
ただし、そのまま UIImageView をカスタムビューとして追加すると、ターゲットとアクションを設定することができなくなります。(UIImageView は UIControl のサブクラスではないため)
そのため、UIControl のサブクラスである UIButton をカスタムビューとして登録します。
これで、枠のない画像を表示することができます。

これをタップすると、大きな画像が表示されます。
今回は、この実装方法をまとめます。
ナビゲーションバーの表示をカスタマイズするには、 UINavigationItem で操作できます。(UINavigationBar ではないのに注意)
コントローラが UIViewController のサブクラスの場合、navigationItem プロパティで現在のナビゲーションバーを取得できます。
UINavigationItem *navigation = self.navigationItem;
左端に表示したい場合は leftBarButtonItem 、右端に表示したい場合は rightBarButtonItem、中央に表示したい場合は titleView プロパティを使います。ただし、左端には前のビューに戻るためのボタンが自動的に表示されるので注意が必要です。
さて、titleView は名前から推測できるとおり UIView ですが、leftBarButtonItem や rightBarButtonItem は UIBarButtonItem というクラスになっています。表示させたいものに応じて、複数の初期化メソッド(initWith...)が用意されています。
画像を表示させる場合は、initWithImage:style:target:action: が使えます。
UIBarButtonItem *button;
button = [[[UIBarButtonItem alloc]
initWithImage: image
style: UIBarButtonItemStylePlain
target: self
action: @selector(showImage:)]
autorelease];
self.navigationItem.rightBarButtonItem = button;
image は UIImage で用意しておきます。action は、タップされたときに呼び出されるアクションメソッド、target はそのメソッドの実装されているオブジェクトを指定します。
しかし、このメソッドを使って画像を表示させると、style での指定にかかわらず、常に枠線が表示されてしまいます。また、画像のスケールもされません。

そこで、initWithCustomView: を使うことにします。
ただし、そのまま UIImageView をカスタムビューとして追加すると、ターゲットとアクションを設定することができなくなります。(UIImageView は UIControl のサブクラスではないため)
そのため、UIControl のサブクラスである UIButton をカスタムビューとして登録します。
UIButton *imageButton;
imageButton = [[[UIButton alloc]
initWithFrame: CGRectMake(0, 0, 30, 40)]
autorelease];
imageButton.contentMode = UIViewContentModeScaleToFill;
[imageButton addTarget:self
action:@selector(showImage:)
forControlEvents:(UIControlEventTouchDown)];
[imageButton setBackgroundImage: image
forState:UIControlStateNormal];
UIBarButtonItem *button;
button = [[[UIBarButtonItem alloc]
initWithCustomView: imageButton]
autorelease];
self.navigationItem.rightBarButtonItem = button;
これで、枠のない画像を表示することができます。
2009年02月21日
iPhone アプリ「BookRemark」をリリースしました
iTunes App Store で、PLT Works 第1弾アプリ「BookRemark」が公開されました。現在、無料アプリとしてリリースしています。
コンセプトは、本が好きな人のための ToDo アプリ+蔵書管理アプリです。
私は本を読むのが好きで、暇を見つけては本屋、古本屋を回っています。そんな自身の経験から、「あったらいいな」というものを形にしました。
こんな経験はありませんか?
何巻も続くシリーズ物の場合、新刊だと思って買ったら、実は既に買った本だった……という経験。
あるいは、古本屋で好きな作家の本を見つけたけれど、それがもう買った本かどうか思い出せない……という経験。
そこで、iPhone / iPod touch 上で、簡単に買った本・買う前の本を管理できるアプリを作りたいと思いました。
このように、発売日順、著者名順に本をリスト(UITableView)で表示しています。


「+」ボタンをタップして、本を追加します。

いくつかの項目を入れて「検索」をタップすれば、詳細な情報を取得できます。

「ふりがな」を設定しておけば、著者名を正しく並べ替えられます。(日本語環境の場合のみ)

発売日の日付選択は、24/7 twenty-four seven の岸川克己さんが公開されている UICCalendarPicker を一部カスタマイズして使用しています。

本を登録した後も、いつでも詳細な情報を確認・編集することができます。

「未購入」「注文済」「購入済」を切り替えることで、リスト上でも今の本の状態がすぐにわかります。
設定で、「Remark」(発売日順)表示のときに購入済みの本を隠すこともできます。こうしておけば、登録した本が増えてきても、まだ買っていない本だけすぐに確認することができます。
カートのアイコンをタップすると、Amazon でその本を購入できます。今は Safari を開いていますが、UIWebView を使って、アプリの内部で開きたいところです(アップデートで対応予定)。
Amazon に未登録(ISBN コード不明)の本でも、とりあえず登録しておいて、サーチ(虫眼鏡)アイコンでいつでも情報をアップデートできます。
ちなみに、最初はリフレッシュボタンを用いていたのですが、検索結果を一覧で表示するシートが開くため、OS標準の動作に沿っていない、として一度リジェクトされました。
左のアクションボタンをタップすれば、同じ著者の本、関連する本を検索して、新たに登録することができます。

将来的には、Mac 上の蔵書管理アプリ、Delicious Libraryなどで登録した蔵書データの読み込みなども検討しています。
ぜひ、ご意見、ご要望などをお寄せください。