Исключение в iPad, UIImagePickerController должно быть представлено через UIPopoverController
Я создал приложение для захвата изображения с камеры. Это мой код
-(IBAction) showCameraUI {
BOOL hasCamera = [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera];
UIImagePickerController* picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
picker.sourceType = hasCamera ? UIImagePickerControllerSourceTypeCamera : UIImagePickerControllerSourceTypePhotoLibrary;
[self presentModalViewController:picker animated:YES];
}
И реализовал этот метод делегата для получения захваченного изображения
- (void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingMediaWithInfo:(NSDictionary *)info
{
[picker dismissModalViewControllerAnimated:YES];
UIImage* image = [info objectForKey:UIImagePickerControllerOriginalImage];
UIImage *yourImageView = image;
}
Реализован этот метод, если пользователь отменяет контроллер
- (void)imagePickerControllerDidCancel:(UIImagePickerController*)picker
{
[picker dismissModalViewControllerAnimated:YES];
}
Но это показывает это исключение. Кто-нибудь знает, почему он показывает такое исключение после выполнения последней строки функции showCameraUI.
UIStatusBarStyleBlackTranslucent is not available on this device. 2013-02-07
10:06:06.976 CaptureImage[460:c07] *** Terminating app due to uncaught exception
'NSInvalidArgumentException', reason: 'On iPad, UIImagePickerController must be
presented via UIPopoverController'
Ответы
Ответ 1
Что касается исключения, сообщение об ошибке очень ясно. "На iPad UIImagePickerController должен быть представлен через UIPopoverController" Для iPad вы должны представить его в UIPopoverController
вместо использования [self presentModalViewController:picker animated:YES];
. Это должно решить проблему.
Например: -
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController:picker];
[popover presentPopoverFromRect:self.view.bounds inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
self.popover = popover;
} else {
[self presentModalViewController:picker animated:YES];
}
Изменить: Как уже упоминалось @rmaddy, камера может быть представлена модально. Вышеприведенное применимо, если sourceType
равно UIImagePickerControllerSourceTypePhotoLibrary
.
Ответ 2
@Arun
Я также сталкиваюсь с той же проблемой, добавляя глобальное свойство в файл заголовка.
Я надеюсь, что код ниже полезен для вас
UIImagePickerController *imgPicker = [[UIImagePickerController alloc] init];
[imgPicker setDelegate:self];
[imgPicker setSourceType:UIImagePickerControllerSourceTypePhotoLibrary];
[imgPicker setAllowsEditing:YES];
[imgPicker setModalPresentationStyle:UIModalPresentationCurrentContext];
UIPopoverController *popOver = [[UIPopoverController alloc] initWithContentViewController:imgPicker];
popOver.delegate = self;
self.popoverImageViewController = popOver;
[self.popoverImageViewController presentPopoverFromRect:CGRectMake(0, 0, 160, 40) inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
В этом файле заголовка создайте глобальное свойство, подобное этому
@property (strong) UIPopoverController *popoverImageViewController;