webentwicklung-frage-antwort-db.com.de

Wie verwende ich UIImagePickerController auf dem iPad?

Hallo, ich arbeite an einer universellen Anwendung (iPhone/iPad). Eine Funktion ist, dass ich ein Foto aus dem Album auswählen und es in UIImageView anzeigen muss.

Das Problem ist, dass es auf dem iPhone gut funktioniert, aber wenn ich versuche, das Fotoalbum zu öffnen, stürzt es ab. Mein Code im Action Sheet Delegate ist dieser:

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


    }


}

kann mir irgendein Körper helfen? ich habe auf stackOverflow gecheckt und es auch gegoogelt aber vergebens.

19
Mashhadi

UIImagePickerController muss muss mit UIPopoverController auf dem iPad angezeigt werden.

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: Füge eine starke Eigenschaft für die UIPopoverController hinzu:

@property (nonatomic, strong) UIPopoverController *popOver;

Der Popover sollte in den Delegate-Methoden abgewiesen werden:

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

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

Hier zeige ich Ihnen den schnellen Weg:

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

Die Apple-Dokumente sagen 

"Präsentieren Sie die Benutzeroberfläche, indem Sie den PresentViewController: animated: completion: -Methode des derzeit aktiven View-Controllers aufrufen, wobei der konfigurierte Image Picker-Controller Als neuer View-Controller übergeben wird. Ein iPad, stellen Sie die Benutzeroberfläche mit einem Popover dar. Dies ist nur gültig, wenn die Eigenschaft sourceType des Image Picker-Controllers auf UIImagePickerControllerSourceTypeCamera gesetzt ist. "

Das sagt genau das Gegenteil davon, wie es sich verhält?!? Sie können UIImagePickerControllerSourceTypeCamera nicht aus einem Popover präsentieren und Sie können UIImagePickerControllerSourceTypePhotoLibrary und UIImagePickerControllerSourceTypeSavedPhotosAlbum modal nicht anzeigen.

Seltsam...

5
cschuff

POST iOS 8: Versuchen Sie, den popOver-Controller in einzufügen 

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

Grund: Dies liegt daran, dass in iOS 8 Warnmeldungen und Aktionsblätter tatsächlich Ansichts-Controller (UIAlertController) dargestellt werden. Wenn Sie also einen neuen View-Controller als Reaktion auf eine Aktion von UIAlertView präsentieren, wird dieser angezeigt, während der UIAlertController abgewiesen wird. Sie müssen dies in der Hauptwarteschlange tun, ohne die Navigation zu stören.

3
Xeieshan

Wenn das Gerät ein iPad ist und der Quellentyp 'photoLibrary' oder 'savedPhotosAlbum' angegeben ist, muss UIImagePickerController entsprechend den Apple-Dokumenten angezeigt werden. In meinem Fall erreiche ich mein Ziel so;

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

Ich habe eine Tabellensichtzelle, die eine Bildansicht enthält. Wenn Sie diese Zelle auswählen, muss der Image Picker-Controller geöffnet werden. Wählen Sie daher die Methode PhotoFromLibrary aus. Wenn das Gerät ein Pad ist, weisen Sie dem Popup-Fenster des Darstellers der Bildauswahl zu und präsentieren Sie es. Konfigurieren Sie dann das Popover-Verhalten. In meinem Fall ist meine SourceView eine Tabellenzelle, die eine Bildansicht enthält, und mein SourceRect ist der Rahmen der Bildansicht.

Sie können auch von den UIPopoverPresentationControllerDelegate-Methoden profitieren, wenn Sie einen Delegaten zuweisen.

0
emredemir