被弃用的UIImagePickerControllerDelegate方法应该使用什么替代?

4
我跟随了一个很棒的教程(http://iphone.zcentric.com/2008/08/28/using-a-uiimagepickercontroller/),学习如何使用UIImagePickerController从iPhone的照片库或相机获取图片。然而,这个教程有点过时了,文档中引用的一种委托方法自3.0版本以来就已经被弃用了。但是文档没有提供替代方案,这让我很困惑。被弃用的方法是:
 imagePickerController:didFinishPickingImage:editingInfo:

上述方法的使用步骤如下:
- (void) imagePickerController:(UIImagePickerController*)picker didFinishPickingImage:(UIImage*)img editingInfo:(NSDictionary*)editInfo
{

    image.image = img;
    [[picker parentViewController] dismissModalViewControllerAnimated:YES];


}

问题:目前在取代已弃用的方法时使用了什么?

2个回答

37

以下简要介绍如何使用新的图像选择器API。

首先,您需要声明一个类,就像这样设置自身为图像选择器代理:

@interface MyClass : UIViewController <UINavigationControllerDelegate, UIImagePickerControllerDelegate> {
UIImagePickerController*    imagePicker;
}
@property(nonatomic,retain) UIImagePickerController* imagePicker;

- (IBAction) takePicture:(id)sender;

@end

调用图片选择器的方法应该像这样。它在这里被声明为一个IBAction,所以你可以直接将其连接到Interface Builder中的控件(如按钮)。它还检查设备类型,如果是iPhone,它会打开相机界面,但如果是iPod Touch,则会打开图库选择器:

#import <MobileCoreServices/UTCoreTypes.h>
...
@synthesize imagePicker = _imagePicker;
...

- (void) takePicture:(id)sender
{
        if (!_imagePicker) {
            self.imagePicker = [[UIImagePickerController alloc] init];
            self.imagePicker.delegate = self;
        }

        if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
            self.imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
            NSArray* mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];
            self.imagePicker.mediaTypes = mediaTypes;
        } else {
            self.imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; 
            self.imagePicker.allowsImageEditing = YES; 
        }

    [self presentModalViewController:self.imagePicker animated:YES];
}

那么你需要这两个方法:
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    [[picker parentViewController] dismissModalViewControllerAnimated:YES]; 

    // MediaType can be kUTTypeImage or kUTTypeMovie. If it's a movie then you
    // can get the URL to the actual file itself. This example only looks for images.
    //   
    NSString* mediaType = [info objectForKey:UIImagePickerControllerMediaType];
    // NSString* videoUrl = [info objectForKey:UIImagePickerControllerMediaURL];

    // Try getting the edited image first. If it doesn't exist then you get the
    // original image.
    //
    if (CFStringCompare((CFStringRef) mediaType, kUTTypeImage, 0) == kCFCompareEqualTo) {       
        UIImage* picture = [info objectForKey:UIImagePickerControllerEditedImage];
        if (!picture)
            picture = [info objectForKey:UIImagePickerControllerOriginalImage];     

            // **You can now do something with the picture.
    }
    self.imagePicker = nil;
}

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker 
{ 
    [[picker parentViewController] dismissModalViewControllerAnimated:YES]; 
    self.imagePicker = nil;
}

1
谢了。我不是为了分数而来这里,而是为了好的因果报应,你刚好让它更上一层楼 :-) - Ramin
「allowsImageEditing」也被弃用了吗? - Jane Sales
我相信它仍然可用于OS 3.0。也许你在想尚未发布的操作系统;-) - Ramin
1
太棒了,@Ramin的回答。还可以提到kUTTypeImage常量需要链接MobileCoreServices.framework。 - Josh

8
引用苹果文档的描述:
imagePickerController:didFinishPickingImage:editingInfo:

Tells the delegate that the user picked an image. This method is optional. (Deprecated in iPhone OS 3.0. Use imagePickerController:didFinishPickingMediaWithInfo: instead.)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接