Что использовать вместо устаревшего метода UIImagePickerControllerDelegate? - PullRequest
2 голосов
/ 04 августа 2009

Я следовал замечательному учебнику (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 ]

34 голосов
/ 04 августа 2009

Вот как использовать новый API выбора изображений в двух словах.

Во-первых, вам нужен класс, объявленный следующим образом, поскольку он устанавливает себя в качестве делегата средства выбора изображений:

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

- (IBAction) takePicture:(id)sender;

@end

Метод, который вызывает средство выбора изображений, будет примерно таким. Он объявлен здесь как IBAction, поэтому вы можете напрямую подключить его к элементу управления (например, к кнопке) в Интерфейсном Разработчике. Он также проверяет, что если вы используете 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;
}
7 голосов
/ 04 августа 2009

Цитирование документации Apple:

imagePickerController:didFinishPickingImage:editingInfo:

Сообщает делегату, что пользователь выбрал изображение.Этот метод не является обязательным.( Устаревший в iPhone OS 3.0. Используйте imagePickerController:didFinishPickingMediaWithInfo: вместо .)

...