web-dev-qa-db-ja.com

iPadでUIImagePickerControllerを使用する方法

こんにちは私はユニバーサルアプリケーション(iPhone/iPad)に取り組んでいます。 1つの機能は、アルバムから写真を選択してUIImageViewに表示する必要があることです。

今問題はそれが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をチェックし、それをググりましたが無駄でした。

19
Mashhadi

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];
}

[〜#〜] edit [〜#〜]UIPopoverControllerの強力なプロパティを追加します:

@property (nonatomic, strong) UIPopoverController *popOver;

デリゲートメソッドでポップオーバーを閉じる必要があります。

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

-(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker 
57
Felix

ここでは、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)
    }
}
6
Peter Kreinz

Apple docsは言う

「現在アクティブなビューコントローラーのpresentViewController:animated:completion:メソッドを呼び出し、構成済みのイメージピッカーコントローラーを新しいビューコントローラーとして渡し、ユーザーインターフェースを提示します。iPadでは、ポップオーバーを使用してユーザーインターフェースを提示します。これを行うのは有効な場合のみです。画像ピッカーコントローラのsourceTypeプロパティがUIImagePickerControllerSourceTypeCameraに設定されている場合。」

それはそれがどのように動作するかとは正反対です!??ポップオーバーからUIImagePickerControllerSourceTypeCameraを提示することができ、UIImagePickerControllerSourceTypePhotoLibraryおよびUIImagePickerControllerSourceTypeSavedPhotosAlbumをモーダルに提示することができます。

奇妙な...

4
cschuff

POST iOS 8:popOverコントローラーを追加してみてください

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

理由:これは、iOS 8では、アラートビューとアクションシートが実際にビューコントローラー(UIAlertController)で表示されるためです。したがって、UIAlertViewからのアクションに応答して新しいビューコントローラーを表示している場合は、それが表示されますUIAlertControllerが閉じられている間。ナビゲーションを妨げずにメインキューで実行する必要があります。

3
Xeieshan

デバイスがiPadで、ソースタイプが「photoLibrary」または「savedPhotosAlbum」に指定されている場合、UIImagePickerControllerは、Apple docs。

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メソッドを呼び出します。この方法では、デバイスがパッドの場合、イメージピッカーのプレゼンテーションスタイルポップオーバーを割り当てて表示します。次に、ポップオーバーの動作を構成します。私の場合、sourceViewはイメージビューを含むテーブルセルで、sourceRectはイメージビューのフレームです。

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

0
emredemir