2012/06/20更新

[XCODE] iPadでImagePickerを使う方法

このエントリーをはてなブックマークに追加      

今日は、iPadでImagePickerを使う方法を学んだので、ブログに残しておきたいと思います。
iPhoneと同じような使い方をしたらエラーに。。iPad用の使い方があるということを書きました。


UIImagePicker on iPad



iPadで、iPhoneのようにImagePickerを開こうとすると

エラーが発生するんです。iPhoneでは、フォトアルバムから写真を取得したり、カメラから写真を取得するには、以下のように実装するかと思います。

UIImagePickerController *imgPicker = [[UIImagePickerController alloc] init];

// 取得元を設定する。今回の場合は、フォトライブラリを指定しています。
imgPicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
imgPicker.delegate = self;

// モーダルビューで開く
[self presentModalViewController:imgPicker animated:YES];

上記コードをiPadで実行すると、以下のようなエラーが出ます。残念(; ̄ェ ̄)

2011-09-24 20:39:35.145 PopOverSample[306:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'On iPad, UIImagePickerController must be presented via UIPopoverController'

英語を読む限り、iPadでUIImagePickerControllerを使う場合には、UiPopoverControllerを使いなさいと言うこと。

という事で、Popoverを使った実装に変更してみます。Popoverについては、 『iPad専用のPopOverControllerを使ってみた』を 参考にしてみて下さい。





Popoverを利用して、UIImagePickerControllerを使う

以下のように実装して、Popoverのなかに、ImagePickerを埋め込みます。

// PhotoLibraryが取得元として利用出来ない場合は、その後の処理は実行しない。
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary] == NO) {
  // ここで何かしらの、失敗メッセージを出すとユーザーに優しい。
  return;
}

// UIImagePickerControllerのインスタンスを作成して、
// 必要な入手元の設定や、delegateの設定を行う。
UIImagePickerController *imgPicker = [[UIImagePickerController alloc] init];
imgPicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
imgPicker.delegate = self;

// 表示に使うPopoverのインスタンスを作成する。 imagePopControllerは、UIPopoverController型のフィールド変数。
// PopoverのコンテンツビューにImagePickerを指定する。
imagePopController = [[UIPopoverController alloc] initWithContentViewController:imgPicker];

// Popoverを表示する。
// senderはBarButtonItem型の変数で、このボタンを起点にPopoverを開く。
[imagePopController presentPopoverFromBarButtonItem:sender 
  permittedArrowDirections:UIPopoverArrowDirectionAny 
  animated:YES];



次に、写真が選択された場合に、そのUIImageを画面に表示して、Popoverを閉じる実装をします。

#pragma mark -
#pragma mark UIImagePickerControllerDelegate implementation
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {

  // ユーザーの選択した写真を取得し、imageViewというUIImageView型のフィールドのイメージに設定する
  UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
  self.imageView.image = image;

  // UIPopoverControllerを閉じる
  [imagePopController dismissPopoverAnimated:YES];
}


また、UIImagePickerControllerDelegateのキャンセル(imagePickerControllerDidCancel:)した時にも、Popoverを消すと、イイですね(*゚▽゚)ノ





最後に

iPadでのプログラミングも出来るようになると楽しい♪(´ε` )もうちょいで、iPad用アプリも完成しそうなので、これからも一つずつ学んで行きたいと思います。







こんな記事もいかがですか?

RSS画像

もしご興味をお持ち頂けましたら、ぜひRSSへの登録をお願い致します。