iOS:UIImagePickerController 问题

Posted

技术标签:

【中文标题】iOS:UIImagePickerController 问题【英文标题】:iOS: UIImagePickerController Issue 【发布时间】:2012-03-25 20:17:59 【问题描述】:

我正在尝试使用 UIImagePickerController 从用户 iPhone / iPad 上的照片中抓取照片。这段代码适用于 iPhone,但是当我在 iPad 上运行它时,调试器会给我消息“由于未捕获的异常‘NSInvalidArgumentException’而终止应用程序,原因:‘在 iPad 上,UIImagePickerController 必须通过 UIPopoverController 呈现’” 。我对 Objective-C 很陌生,所以我不确定如何编辑这段代码以在 iPad 上运行 UIPopoverController 时使用它。我宁愿不创建 2 个新的视图控制器,所以我想知道是否有人知道我需要添加什么代码才能让它在 iPhone 和 iPad 上运行。这是我的视图控制器中的代码:

ViewController.h:

    @interface PhotoViewController : UIViewController <UINavigationControllerDelegate, UIImagePickerControllerDelegate> 
        UIButton *grabButton;
        UIImageView *image;
        UIImagePickerController *imgPicker;
    
    @property (strong, nonatomic) IBOutlet UIButton *grabButton;
    @property (strong, nonatomic) IBOutlet UIImageView *image;
    @property (strong, nonatomic) UIImagePickerController *imgPicker;

    - (IBAction)grabImage;

    @end

ViewController.m:

    #import "PhotoViewController.h"


    @implementation PhotoViewController
    @synthesize grabButton;
    @synthesize image;
    @synthesize imgPicker;

    - (IBAction)grabImage 
        [self presentModalViewController:self.imgPicker animated:YES];
    

    - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)img editingInfo:(NSDictionary *)editInfo 
        image.image = img;
        [[picker parentViewController] dismissModalViewControllerAnimated:YES];
    

    - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
    
        self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
        if (self) 
            self.title = NSLocalizedString(@"Photo Gallery", @"Photo Gallery");
            self.tabBarItem.image = [UIImage imageNamed:@"42-photos.png"];
        
        return self;
    

    - (void)viewDidLoad
    
        self.imgPicker = [[UIImagePickerController alloc] init];
        self.imgPicker.allowsImageEditing = YES;
        self.imgPicker.delegate = self;
        self.imgPicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
        [super viewDidLoad];
    

提前致谢!

【问题讨论】:

【参考方案1】:

您可以通过该错误消息找到答案!

将 UIPopOverController 与 iPad 的 UIImagePicker 一起使用。

如果你想知道如何使用 UIPopOverController,可以看看这个tutorial!

另一个 youtube 教程 - http://www.youtube.com/watch?v=6Gc3kxVwfmE

【讨论】:

感谢您的回答。但我对编程很陌生,这些教程让我头疼。我只是想知道我需要对代码进行哪些更改才能使其兼容 iPhone 和 iPad。 抱歉,我刚刚登录...看来您的答案来自@aryaxt :) 酷。 一切都很好,非常感谢您的帮助!我在实现它时遇到了问题,但我只是决定最好创建另一个问题而不是堵塞这个问题。再次感谢! 当然。如果你有任何问题..让我知道:)【参考方案2】:

就像 Legolas 提到的,在 iPad 应用程序中,您必须使用 UIPopOverController 来呈现 imagePicker。我通常不喜欢在我的应用中使用任何代码来执行基于设备类型的任务,但如果您没有找到更好的解决方案,您可以执行以下操作。

if ([[UIDevice currentDevice].model isEqual:@"iPad"])

   // Display image picker in a popover

else

   // display imagePicker as a modal

查看设备型号的文档: http://developer.apple.com/library/ios/#documentation/uikit/reference/UIDevice_Class/Reference/UIDevice.html

【讨论】:

非常感谢!我应该将此添加到我的 viewDidLoad 方法中吗? 是的,你可以在 viewDidLoad 上做到这一点 试试这个:([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad)【参考方案3】:

它对我有用。请尝试以下代码

if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) 
    UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController:self.imgpicker];
    popover.delegate =self;
    [popover presentPopoverFromRect:self.view.bounds inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];else
[self presentModalViewController:self.imgpicker animated:YES];

【讨论】:

以上是关于iOS:UIImagePickerController 问题的主要内容,如果未能解决你的问题,请参考以下文章

imagePickerController 选择照片时出错

iPhone - 以编程方式删除状态栏

如何调整自定义 UIButton 的图像大小?

从保存的相机胶卷参考 url 设置 uiimageview

Segue 图像到另一个视图控制器的问题

{python之IO多路复用} IO模型介绍 阻塞IO(blocking IO) 非阻塞IO(non-blocking IO) 多路复用IO(IO multiplexing) 异步IO