Как использовать UIImagePickerController в iPad? - PullRequest
19 голосов
/ 26 января 2012

Привет, я работаю над универсальным приложением (iPhone / iPad). одна особенность в том, что мне нужно выбрать фотографию из альбома и показать ее в 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 и также погуглил его, но тщетно.

Ответы [ 4 ]

57 голосов
/ 26 января 2012

UIImagePickerController должен быть представлен с UIPopoverController на 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];
}

РЕДАКТИРОВАТЬ : Добавить сильное свойство для UIPopoverController:

@property (nonatomic, strong) UIPopoverController *popOver;

Поповер должен быть отклонен в методах делегата:

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

-(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker 
6 голосов
/ 12 сентября 2014

Здесь я покажу вам путь 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)
    }
}
4 голосов
/ 27 января 2012

Документы Apple говорят:

"Представьте пользовательский интерфейс, вызвав presentViewController: animated: завершение: метод текущего активного контроллера представления, передавая сконфигурированный контроллер средства выбора изображений в качестве нового контроллера представления.На iPad представьте пользовательский интерфейс, используя всплывающее окно. Это допустимо только в том случае, если для свойства sourceType контроллера средства выбора изображений установлено значение UIImagePickerControllerSourceTypeCamera. "!?Вы НЕ МОЖЕТЕ представить UIImagePickerControllerSourceTypeCamera из поповера, и Вы НЕ МОЖЕТЕ представить UIImagePickerControllerSourceTypePhotoLibrary и UIImagePickerControllerSourceTypeSavedPhotosAlbum модально.

Странно ...

3 голосов
/ 12 ноября 2015

POST iOS 8: попробуйте добавить контроллер popOver в

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

Причина: Это потому, чтов iOS 8 представления предупреждений и листы действий фактически представлены контроллерами представления (UIAlertController).Таким образом, если вы представляете новый контроллер представления в ответ на действие из UIAlertView, он будет представлен, пока UIAlertController закрывается.Вы должны сделать это в главной очереди, не нарушая навигацию.

...