iPhoneSDKプログラミングガイドを見ながらiPhone開発を続けてみました。今日やったのはchapter5の「最初のプログラム」。iPhoneのフォトアルバムにある写真を取得して表示するというものです。
InterfaceBuilderでViewを置いてImageを置いてボタンを配置してみたいな事をやってパタパタとコードを書いたら結構簡単に出来ました。
けど、正直よくわからない。iPhoneSDKプログラミングガイドだけではちょっと理解に苦しむ事ばかりなので「作ってみてからググって色々調べる」というのを繰り返してみたらわかってきたのでメモしておきます。
ちなみに、このアプリケーションで参考にさせて頂いたのは、[iPhone] カメラによる写真撮影とフォトライブラリの写真利用についてです。
フォトアルバムを利用する上でのポイントは、
- (なんにしてもイメージを表示するので)UIViewControllerを継承してイメージビューアアプリを作るという事
- イメージの取得にはUIImagePickerControllerを使うという事
- UIImagePickerControllerでは、delegateを指定するという事。
- 上記delegateを指定するためUINavigationControllerDelegate / UIImagePickerControllerDelegateプロトコル(javaで言うinterface)を実装する必要があるという事
- イメージ選択画面はモーダルビューで制御するという事。
- モーダルビューとは読んだまんま、そのビューの処理が終わらないと元のビューに移動できないビューの事。
で、今回はフォトアルバムからイメージを取得するというアプリなのですが、そのフォトアルバムが使えるかどうか調べる必要があります(ただ、フォトアルバムが使えない状態がどういう状態なのかわからないので、作法という意味での実装)。
デベロッパドキュメントを見てみると、イメージを取得するためのUIImagePickerControllerには、クラスメソッドとして「isSourceTypeAvailable」を持っていて、引数にUIImagePickerControllerSourceType型を取って、この引数が使えるかどうかをチェックするというメソッドがあります。
フォトアルバムを表すUIImagePickerControllerSourceTypeは、UIImagePickerControllerSourceTypePhotoLibraryのようなのでこれを与えて調べてみます。
つまり、
// フォトアルバムは使えるのか。
if([UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypePhotoLibrary]){
// implementation...
}
こんな感じでフォトアルバムが使えるかどうかチェックするようです。で、使えるなら、UIImagePickerControllerのsourceTypeにUIImagePickerControllerSourceTypePhotoLibraryを設定してdelegateするという処理になります。
if([UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypePhotoLibrary]){
UIImagePickerController *imgPicker;
// アロケートして
imgPicker = [ [ UIImagePickerController alloc ] init];
// sourceTypeにフォトアルバムを設定する。
imgPicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
// イメージビューアアプリ自分自身が
// UINavigationControllerDelegate / UIImagePickerControllerDelegateをinterface(実装)しているのでselfを渡す。
imgPicker.delegate = self;
// ココは知らない。イメージが編集できるかどうか?かな?今回は編集しないのでNO
imgPicker.allowsImageEditing = NO;
とこんなかんじ。
つぎは、モーダルビューの表示について。
モーダルビューはpresentModalViewControllerを使って開いて、dismissModalViewControllerAnimatedで閉じるみたい。
// アニメーションしながらモーダルビューを開く [self presentModalViewController: imgPicker animated:YES];
こんな感じ。今作ってるイメージビューアアプリは冒頭のポイントに記したとおり、UIViewControllerを継承しているので、selfからpresentModalViewControllerを使う。
presentModalViewControllerの定義は、
- (void)presentModalViewController:(UIViewController *)modalViewController animated:(BOOL)animated
こんな定義で、パラメータのpickerはUIImagePickerControllerで作ったけど、UIViewControllerを継承しているので渡せると。ふむ。書いててだんだん理解できて来た。
で、今度は閉じる動作なんだけど、モーダルビューを開いて、イメージが選択された時か、キャンセルされたときに閉じたい。ので、UIImagePickerControllerDelegateでデリゲート(委譲)された時のメソッドを実装します。
// 画像を選択した時のデリゲート
-( void ) imagePickerController:( UIImagePickerController* ) imgPicker
didFinishPickingImage:( UIImage* ) image
editingInfo:( NSDictionary* ) editingInfo
{
// implementation
// ここで閉じる処理dismissModalViewControllerAnimated
}
// キャンセルされた時のデリゲート
-( void ) imagePickerControllerDidCancel:( UIImagePickerController* ) imgPicker
{
// implementation
// ここで閉じる処理dismissModalViewControllerAnimated
}
とこんな感じ。おお。エントリ書いてみたら結構理解できた。










