在iPad中,UIImagePickerController必须通过UIPopoverController呈现

Aru*_*run 11 iphone objective-c ipad ios ios6

我已经从相机创建了一个捕获图像的应用程序.这是我的代码

 -(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];
}
Run Code Online (Sandbox Code Playgroud)

并实现了这种委托方法来获取捕获的图像

- (void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    [picker dismissModalViewControllerAnimated:YES];
    UIImage* image = [info objectForKey:UIImagePickerControllerOriginalImage];
    UIImage *yourImageView = image;
}
Run Code Online (Sandbox Code Playgroud)

如果用户取消控制器,则实现此方法

- (void)imagePickerControllerDidCancel:(UIImagePickerController*)picker
{
    [picker dismissModalViewControllerAnimated:YES];
}
Run Code Online (Sandbox Code Playgroud)

但它显示了这个例外.有没有人知道为什么它在执行函数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'
Run Code Online (Sandbox Code Playgroud)

iDe*_*Dev 14

关于异常,错误消息非常清楚."在iPad上,必须通过UIPopoverController呈现UIImagePickerController"对于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];
}
Run Code Online (Sandbox Code Playgroud)

编辑:正如@rmaddy所提到的,相机可以模态呈现.以上是适用sourceTypeUIImagePickerControllerSourceTypePhotoLibrary.

  • @Arun,正如iMartin所说,你需要保留popover,我已经修改了我的答案来表明.为弹出窗口声明一个`@ property`并使用它,如答案中所示.如果您是初学者,我建议您阅读[Raywenderlich iPhone教程](http://www.raywenderlich.com/tutorials) (2认同)

Mad*_*ddy 5

@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];
Run Code Online (Sandbox Code Playgroud)

在该头文件中创建这样的全局属性

@property (strong) UIPopoverController *popoverImageViewController;
Run Code Online (Sandbox Code Playgroud)