2012-01-26 7 views
17

Привет, я работаю над универсальным приложением (iPhone/iPad). одна особенность заключается в том, что мне нужно выбрать фотографию из альбома и показать ее на UIImageView.Как использовать UIImagePickerController в iPad?

Теперь проблема в том, что она работает хорошо на 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, но зря.

+0

Если кто-то Посвятит, тогда PLZ также напишет его причину, cz я попытался разобраться, но ничего не помог мне, вот почему я спросил этот вопрос здесь – Mashhadi

+0

Зачем? Если это память, вы пробовали NSZombiesEnabled? – gerry3

+0

«Программный сигнал SIGABRT» это исключение – Mashhadi

ответ

56

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 
+0

этот ответ является неполным. Что такое self.popOver? нет определения его в представленном коде –

+7

Это не так неполно, вам просто нужно читать между строками ... Очевидно, self.popOver является свойством типа 'UIPopoverController', который предположительно используется для обработки закрытия всплывающего окна позже , Just sayin ' – mprivat

+3

Нет, он неполный. Если мы должны «читать между строками», то нам, по крайней мере, нужно направление для «чтения». Это учебный форум. Поздравляю с опытом работы с iOS, но не нужно грубить. – edthethird

5

Документах Apple, говорят

"Present the user interface by calling the presentViewController:animated:completion: method of the currently active view controller, passing your configured image picker controller as the new view controller. On iPad, present the user interface using a popover. Doing so is valid only if the sourceType property of the image picker controller is set to UIImagePickerControllerSourceTypeCamera."

Это говорит о полной противоположности тому, как он себя ведет?!? Вы НЕ ПРЕДЛАГАете подарок UIImagePickerControllerSourceTypeCamera от popover, и вы CANT настоящее время UIImagePickerControllerSourceTypePhotoLibrary и UIImagePickerControllerSourceTypeSavedPhotosAlbum модально.

Странно ...

6

Здесь я покажу вам путь СВИФТ:

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

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

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

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

0

Если устройство 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, если назначить делегат.

Смежные вопросы