Как использовать UIImagePickerController в iPad?

Привет, я работаю над универсальным приложением (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, а также googled, но зря.

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

EDIT : добавьте сильное свойство для UIPopoverController :

 @property (nonatomic, strong) UIPopoverController *popOver; 

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

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

Здесь я покажу вам способ 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) } } 

Apple сообщает, что

«Представьте пользовательский интерфейс, вызвав метод currentViewController: анимированный: завершение: текущий активный controller представления, передав ваш настроенный controller выбора изображений в качестве нового controllerа представления. На iPad представите пользовательский интерфейс, используя popover. если для свойства sourceType для controllerа выбора изображения установлено значение UIImagePickerControllerSourceTypeCamera. ”

Это говорит о полной противоположности тому, как он себя ведет?!? Вы не можете предоставить UIImagePickerControllerSourceTypeCamera из popover, и вы CANT представляете UIImagePickerControllerSourceTypePhotoLibrary и UIImagePickerControllerSourceTypeSavedPhotosAlbum .

Странный…

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

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

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

Если устройство iPad, а тип источника указан «photoLibrary» или «savedPhotosAlbum», UIImagePickerController должен быть представлен popover в соответствии с документами 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) } } 

У меня есть ячейка просмотра таблицы, которая включает в себя изображение. Для выбора этой ячейки необходимо открыть диспетчер выбора изображений, поэтому вызовы выбирают метод PhothotFromLibrary. В этом методе, если устройство представляет собой пэд, назначьте стиль презентации подборщика изображений и представите его. Затем настройте поведение popover. В моем случае мой sourceView – это ячейка таблицы, которая включает в себя представление изображения, а мой источникRect – это кадр изображения.

Вы также можете воспользоваться методами UIPopoverPresentationControllerDelegate, если назначить делегата.

  • UIImagePickerController не заполняет экран
  • Давайте будем гением компьютера.