web-dev-qa-db-fra.com

Comment utiliser UIImagePickerController sur iPad?

Bonjour, je travaille sur une application universelle (iPhone/iPad). Une caractéristique est que je dois sélectionner une photo de l'album et la montrer sur UIImageView.

Maintenant, le problème est que cela fonctionne bien sur iPhone, mais lorsque j'essaie d'ouvrir un album photo, il se bloque. mon code dans la fiche d'action délégué est la suivante:

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


    }


}

est-ce qu'un corps peut m'aider? J'ai vérifié sur stackOverflow et l'ai également cherché dans Google mais en vain.

19
Mashhadi

UIImagePickerController doit être présenté avec UIPopoverController sur iPad.

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: Ajoute une propriété forte à la UIPopoverController:

@property (nonatomic, strong) UIPopoverController *popOver;

Le popover doit être ignoré dans les méthodes déléguées:

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

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

Ici je vous montre la manière rapide:

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

Les documents Apple disent 

"Présentez l'interface utilisateur en appelant la méthode PresentViewController: animée: complétion: du contrôleur de vue actif actuellement , En transmettant votre contrôleur de sélecteur d'images configuré En tant que nouveau contrôleur de vue. iPad, présentez l'interface utilisateur à l'aide d'un popover. Cette action n'est valide que si la propriété sourceType du contrôleur du sélecteur d'images est définie sur UIImagePickerControllerSourceTypeCamera. "

Cela dit exactement le contraire de la façon dont il se comporte?!? Vous pouvez présenter UIImagePickerControllerSourceTypeCamera à partir d'un popover et vous pouvez présenter UIImagePickerControllerSourceTypePhotoLibrary et UIImagePickerControllerSourceTypeSavedPhotosAlbum modalement.

Étrange...

5
cschuff

POST iOS 8: Essayez d’ajouter un contrôleur popOver dans 

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

Raison: En effet, dans iOS 8, les vues d'alerte et les feuilles d'action sont en réalité des contrôleurs de vue présentés (UIAlertController). Ainsi, si vous présentez un nouveau contrôleur de vue en réponse à une action de UIAlertView, il est présenté pendant le licenciement de UIAlertController. Vous devez le faire en file d'attente principale sans perturber la navigation.

3
Xeieshan

Si l'appareil est un iPad et que le type de source est spécifié, "photoLibrary" ou "savedPhotosAlbum", UIImagePickerController doit être présenté conformément aux documents Apple. Dans mon cas, j'atteins mon objectif comme ceci;

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)
    }
}

J'ai une cellule de vue de tableau qui comprend une vue d'image. La sélection de cette cellule doit ouvrir le contrôleur du sélecteur d'images. Par conséquent, la méthode ChoosePhotoFromLibrary est appelée. Dans cette méthode, si le périphérique est un pad, assignez le style de présentation du sélecteur d’image et présentez-le. Ensuite, configurez le comportement de popover. Dans mon cas, mon sourceView est une cellule de tableau qui inclut une vue, et mon sourceRect est le cadre de la vue.

Vous pouvez également bénéficier des méthodes UIPopoverPresentationControllerDelegate si vous affectez un délégué.

0
emredemir