[XCODE] iPadでImagePickerを使う方法
今日は、iPadでImagePickerを使う方法を学んだので、ブログに残しておきたいと思います。
iPhoneと同じような使い方をしたらエラーに。。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用アプリも完成しそうなので、これからも一つずつ学んで行きたいと思います。