2012-01-26 19 views
17

こんにちは私は普遍的なアプリケーション(iPhone/iPad)で作業しています。 1つの特徴は、アルバムから写真を選択してUIImageViewに表示する必要があることです。iPadでUIImagePickerControllerを使用するには?

問題は、iPhoneでうまくいっていることですが、写真アルバムを開こうとするとクラッシュします。アクションシートデリゲートの私のコードはこれです:

- (void) actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad){ 
     if (([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])) 

     { 
      if (buttonIndex == 0) 
      { 
       [self lockAllImagesOnTheScreen]; 
       imagePicker.sourceType=UIImagePickerControllerSourceTypeCamera; 
       [self presentModalViewController:imagePicker animated:YES]; 
      } 
      if (buttonIndex == 1) 
      { 
       [self lockAllImagesOnTheScreen]; 

       imagePicker.sourceType= UIImagePickerControllerSourceTypePhotoLibrary; 
       [self presentModalViewController:imagePicker animated:YES]; 
      } 

     } 
     else { 

      if (buttonIndex == 0) 
      { 
       [self lockAllImagesOnTheScreen]; 
       imagePicker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum; 
       imagePicker.sourceType= UIImagePickerControllerSourceTypePhotoLibrary; 
       [self presentModalViewController:imagePicker animated:YES]; 
      } 
     } 



    } 

    else{ 
     if (([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])) 

     { 
      if (buttonIndex == 0) 
      { 
       [self lockAllImagesOnTheScreen]; 
       imagePicker.sourceType=UIImagePickerControllerSourceTypeCamera; 
       [self presentModalViewController:imagePicker animated:YES]; 
      } 
      if (buttonIndex == 1) 
      { 
       [self lockAllImagesOnTheScreen]; 

       imagePicker.sourceType= UIImagePickerControllerSourceTypePhotoLibrary; 
       [self presentModalViewController:imagePicker animated:YES]; 
      } 

     } 
     else { 

      if (buttonIndex == 0) 
      { 
       [self lockAllImagesOnTheScreen]; 
       imagePicker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum; 
       imagePicker.sourceType= UIImagePickerControllerSourceTypePhotoLibrary; 
       [self presentModalViewController:imagePicker animated:YES]; 
      } 
     } 


    } 


} 

体は私を助けますか?私はstackOverflowでチェックしても、それを無駄にgoogled。

+0

もしも誰かが献身するなら、plzもその理由を書いてください、私はそれを理解するために1度試しましたが、何も助けなかったので、私はこの質問をここで聞いたのです – Mashhadi

+0

例外は何ですか?それが記憶なら、NSZombiesEnabledを試してみましたか? – gerry3

+0

"プログラム受信信号SIGABRT"例外です – Mashhadi

答えて

56

UIImagePickerControllerは、iPadでUIPopoverControllerとする必要があります。

if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) { 
    UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController:picker]; 
    [popover presentPopoverFromRect:self.selectedImageView.bounds inView:self.selectedImageView permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; 
    self.popOver = popover; 
} else { 
    [self presentModalViewController:picker animated:YES]; 
} 

EDITUIPopoverControllerのための強力なプロパティを追加します。

@property (nonatomic, strong) UIPopoverController *popOver; 

をポップオーバーは、デリゲートメソッドで却下されるべきである。

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 

-(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker 
+0

この回答は不完全です。 self.popは何ですか?そのコードの定義はありません –

+7

これは不完全ではないので、行間を読んでみてください...明らかにself.popOverは 'UIPopoverController'型のプロパティです。おそらく後でポップアップを閉じるのを処理するために使われます。ちょうど ' – mprivat

+3

いいえ、それは不完全です。私たちが "行間を読む"とすれば、少なくとも "読む"方向が必要です。これは学習フォーラムです。あなたのiOsの経験をお祈りしますが、失礼する必要はありません。 – edthethird

5

アップルのドキュメントが

言います

"Present the user interface by calling the presentViewController:animated:completion: method of the currently active view controller, passing your configured image picker controller as the new view controller. On iPad, present the user interface using a popover. Doing so is valid only if the sourceType property of the image picker controller is set to UIImagePickerControllerSourceTypeCamera."

それは、それがどう動くかとは正反対のことを言っていますか? CANTはUIImagePickerControllerSourceTypeCameraをポップオーバーから提示し、CANTはUIImagePickerControllerSourceTypePhotoLibraryUIImagePickerControllerSourceTypeSavedPhotosAlbumをモーダルに提示します。

奇妙な...ここで

6

私はあなたにSWIFTの方法を示しています。

import UIKit 
class StoreItemViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate 
{ 
    @IBOutlet weak var button: UIButton! 
    @IBOutlet weak var productImage: UIImageView! 
    var popOver:UIPopoverController? 

    @IBAction func buttonSelected(sender:UIButton) 
    { 
     if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.SavedPhotosAlbum) 
     { 
      var imagePickerController = UIImagePickerController() 
      imagePickerController.delegate = self 
      imagePickerController.sourceType = UIImagePickerControllerSourceType.SavedPhotosAlbum 
      imagePickerController.allowsEditing = false 

      if UIDevice.currentDevice().userInterfaceIdiom == UIUserInterfaceIdiom.Pad 
      { 
       self.popOver = UIPopoverController(contentViewController: imagePickerController) 
       self.popOver?.presentPopoverFromRect(self.productImage.bounds, inView: self.productImage, permittedArrowDirections: UIPopoverArrowDirection.Any, animated: true)  
      } 
      else 
      { 
       self.presentViewController(imagePickerController, animated: true, completion: { imageP in 

       }) 
      } 
     } 
    } 

    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) { 
     //do anything with the image 
     let selectedImage = info[UIImagePickerControllerOriginalImage] as UIImage 

     //closing the popup 
     popOver?.dismissPopoverAnimated(true) 

    } 

    func imagePickerControllerDidCancel(picker: UIImagePickerController) 
    { 
     println("cancel") 

     //closing the popup 
     popOver?.dismissPopoverAnimated(true) 
    } 
} 
2

POSTのiOS 8:これは : てみてくださいは

[[NSOperationQueue mainQueue] addOperationWithBlock:^{ }];

理由でポップオーバーのコントローラを追加しますiOS 8では、アラートビューとアクションシートが実際にビューコントローラ(UIAlertController)に表示されるためです。したがって、UIAlertViewからのアクションに応答して新しいView Controllerを提示している場合は、UIAlertControllerが終了している間に表示されています。ナビゲーションを妨げることなくメインキューで行う必要があります。

0

デバイスがiPadで、ソースタイプが 'photoLibrary'または 'savedPhotosAlbum'に指定されている場合、UIImagePickerControllerはAppleのドキュメントに従ってポップオーバーする必要があります。私の場合、私はこのような目標を達成しました。

func choosePhotoFromLibrary() { 
    let imagePicker = UIImagePickerController() 
    imagePicker.sourceType = .photoLibrary 
    imagePicker.delegate = self 
    imagePicker.allowsEditing = true 

    if UIDevice.current.userInterfaceIdiom == .pad { 
     imagePicker.modalPresentationStyle = .popover 
     present(imagePicker, animated: true, completion: nil) 

     let imagePickerPopOverPresentationController = imagePicker.popoverPresentationController 
     imagePickerPopOverPresentationController?.permittedArrowDirections = .up 

     let photoPickingTableCell = tableView.cellForRow(at: IndexPath(row: 2, section: 0)) 

     imagePickerPopOverPresentationController?.sourceView = photoPickingTableCell 
     imagePickerPopOverPresentationController?.sourceRect = profilePhotoImageView.frame 
    } 
    else { 
     present(imagePicker, animated: true, completion: nil) 
    } 
} 

私は画像ビューを含むテーブルビューセルを持っています。そのセルを選択すると画像ピッカーコントローラが開くので、choosePhotoFromLibraryメソッドを呼び出します。この方法では、デバイスがパッドの場合は、イメージピッカーのプレゼンテーションスタイルのポップオーバーを割り当てて提示します。次に、Popoverの動作を構成します。私の場合、私のsourceViewは、画像ビューを含むテーブルセルで、sourceRectは画像ビューのフレームです。

デリゲートを割り当てる場合は、UIPopoverPresentationControllerDelegateメソッドを使用することもできます。