Как использовать 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, но тщетно.
Ответы
Ответ 1
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
Ответ 2
Здесь я покажу вам способ 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)
}
}
Ответ 3
Apple сообщает, что
"Представьте пользовательский интерфейс, вызвав presentViewController: анимированный: завершение: метод текущего активный контроллер просмотра, передача настроенного устройства для выбора изображений контроллер в качестве нового контроллера. На iPad представите пользователя интерфейс с использованием popover. Это справедливо, только если sourceType для свойства контроллера выбора изображения установлено значение UIImagePickerControllerSourceTypeCamera".
Это говорит о полной противоположности тому, как она себя ведет?!? Вы не можете принять UIImagePickerControllerSourceTypeCamera
от popover, и вы CANT присутствуете UIImagePickerControllerSourceTypePhotoLibrary
и UIImagePickerControllerSourceTypeSavedPhotosAlbum
по умолчанию.
Странно...
Ответ 4
POST iOS 8:
Попробуйте добавить контроллер popOver в
[[NSOperationQueue mainQueue] addOperationWithBlock: ^ { }];
Причина:
Это связано с тем, что в iOS 8 представления предупреждений и таблицы действий фактически представлены контроллерами представлений (UIAlertController). Итак, если вы представляете новый контроллер представлений в ответ на действие из UIAlertView, оно отображается во время отклонения UIAlertController. Вам нужно сделать это в главной очереди, не нарушая навигацию.
Ответ 5
Если устройство 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, если назначить делегат.