UIImagePickerController + Cropping: что позволяет делать Editing, а что нет?

После прочтения документации и пример кода из apple относительно UIImagePickerController и после чтения многих руководств и даже Questions здесь, в Stackoverflow (или здесь), я пришел к выводу, что встроенный UIImagePicker способен представить "урожай" окно "пользователю и разрешить пользователю обрезать и перемещать правую часть изображения, которое он хочет использовать.

Но, проверяя эти примеры на iOS 7.1, окно обрезки отсутствует. Нет ничего, что позволило бы пользователю вырезать часть взятого изображения. Все тесты проводились на реальном оборудовании (iPhone 5S), здесь не использовался симулятор iPhone из-за отсутствия камеры;)

Кроме того, в методе делегата "didFinishPickingMediaWithInfo" в "info" -NSDictionary отсутствует запись "UIImagePickerControllerEditedImage".

Что я сделал:

    UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init];

#if TARGET_IPHONE_SIMULATOR
    // iPhone-Simulator has no camera, just save images to the photoalbum on the simulator to use them here
    imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
#else
    imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera;
#endif

    imagePickerController.editing = YES;
    imagePickerController.delegate = (id)self;
    imagePickerController.cameraCaptureMode = UIImagePickerControllerCameraCaptureModePhoto;


    [self presentModalViewController:imagePickerController animated:YES];

и метод делегата:

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
    UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
        // .... do something 
}

В этот момент в Словаре доступно только 3 ключа с именем "info":

  • UIImagePickerControllerOriginalImage
  • UIImagePickerControllerMediaMetadata​​li >
  • UIImagePickerControllerMediaType

ничего другого. Кроме того, не было ни одного окна обрезки или каких-либо аналогичных элементов управления.

Неужели я ошибаюсь в своих ожиданиях относительно поведения ImagePicker? На этом SF-вопросе пользователь написал "Окно обрезания" . Удалась ли функция? Является ли устаревшая документация или я совершенно не прав?

Я также пробовал этот код, взятый из другого ответа на аналогичный вопрос:

- (void)    imagePickerController:(UIImagePickerController *)picker 
    didFinishPickingMediaWithInfo:(NSDictionary *)info 
{
    [picker dismissViewControllerAnimated:YES completion:^{
          // Edited image works great (if you allowed editing)
        UIImage *image = [info objectForKey:UIImagePickerControllerEditedImage];
          // AND the original image works great
        UIImage *originalImage = [info objectForKey:UIImagePickerControllerOriginalImage];
          // AND do whatever you want with it, (NSDictionary *)info is fine now
        UIImage *myImage = [info objectForKey:UIImagePickerControllerEditedImage];
    }];
}

Не отображается окно обрезки, в "Info-NSDictionary" отсутствует ключ "UIImagePickerControllerEditedImage".

Может ли кто-нибудь объяснить мне правильное поведение? Большое вам спасибо заранее.

Ответ 1

этот работает для меня:

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    UIImage *originalImage, *editedImage;

    editedImage = (UIImage *) [info objectForKey:UIImagePickerControllerEditedImage];
    originalImage = (UIImage *) [info objectForKey:UIImagePickerControllerOriginalImage];

    if (editedImage)
        self.profilePictureImageView.image = editedImage;
    else
        self.profilePictureImageView.image = originalImage;

    [picker dismissViewControllerAnimated:YES completion:nil];
}

Ответ 2

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

#import <MobileCoreServices/UTCoreTypes.h>

Затем попробуйте следующий код

    UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];

#if TARGET_IPHONE_SIMULATOR
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeSavedPhotosAlbum]){
        imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
    }
#else
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]){
        imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
    }
#endif

    imagePicker.mediaTypes = @[(NSString *)kUTTypeImage];
    imagePicker.allowsEditing = YES;
    imagePicker.delegate = self;

    //[self presentModalViewController:imagePicker animated:YES]; <-- This method is deprecated use the following instead

    [self presentViewController:imagePicker animated:YES completion:nil];