Установите минимальный уровень масштабирования для обрезки UIImagePickerController

Я использую UIImagePickerController, чтобы пользователь мог загружать фотографию для использования в моем приложении. После выбора фотографии для загрузки пользователю предлагается обрезать свою фотографию (поскольку я установил imagePickerController.allowsEditing = YES). Однако, если фотография является альбомной (т. Е. Шире, чем выше), в настоящее время пользователь может кадрировать фотографию таким образом, чтобы не выводить квадратное изображение. Это связано с тем, что уровень масштабирования по умолчанию при кадрировании пейзажных фотографий - это форматное соотношение, а не форматное заполнение (как для портретных фотографий).

Можно ли установить минимальный уровень масштабирования для режима редактирования UIImagePickerController? Я полагаю, я мог бы просто автоматически обрезать изображение, если результат не квадратный, но я бы предпочел, чтобы режим редактирования UIImagePickerController передавал это пользователю, а не делал это за него.


person Ken M. Haggerty    schedule 12.12.2012    source источник


Ответы (1)


Невозможно настроить поведение функции UIImagePickerController кадрирования / редактирования поддерживаемым способом. Вы могли бы покопаться в UIImagePickerController иерархии контроллеров / представлений и попытаться выяснить, как это работает, но это не очень удобная или приятная вещь.

Сказав это, UIImagePickerController является подклассом UINavigationController, поэтому ничто не мешает вам реализовать собственный контроллер представления для редактирования изображений и перенести его на UIImagePickerController. Это, вероятно, не будет слишком сложно, вы можете просто бросить выбранный UIImage в UIScrollView с прямоугольным оверлеем, показывающим область обрезки, выполнить некоторые вычисления и самостоятельно обрезать UIImage. Очевидно, что в этом случае у вас будет полный контроль над функциональностью, и я уверен, что на реализацию потребуется меньше времени, чем на копание в нутро UIImagePickerController.

Я бы, вероятно, настроил его независимо от того, какой контроллер представления представил бы средство выбора следующим образом:

@interface MainViewController <UIImagePickerControllerDelegate, UINavigationControllerDelegate, ImageEditorViewControllerDelegate>
@end

@implementation MainViewController {
    UIImagePickerController* _imagePickerController;
}
#pragma mark IBAction
- (IBAction)pickImage:(id)sender {
    _imagePickerController = [[UIImagePickerController alloc] init];
    _imagePickerController.delegate = self;
    _imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
    _imagePickerController.allowsEditing = NO;

    [self presentViewController:_imagePickerController animated:YES completion:nil];
}


#pragma mark UIImagePickerControllerDelegate
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
    ImageEditorViewController* imageEditorViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"ImageEditor"];
    imageEditorViewController.delegate = self;
    imageEditorViewController.imageToEdit = info[UIImagePickerControllerOriginalImage];

    [_imagePickerController pushViewController:imageEditorViewController animated:YES];
}


- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
    [self dismissViewControllerAnimated:YES completion:^{
        _imagePickerController = nil;
    }];
}


#pragma mark ImageEditorViewControllerDelegate
- (void)imageEditorViewController:(ImageEditorViewController *)imageEditorViewController didFinishWithInfo:(NSDictionary *)info {
    // TODO: Handle the edited media

    [self dismissViewControllerAnimated:YES completion:^{
        _imagePickerController = nil;
    }];
}
@end

И тогда ваше представление редактирования будет иметь такой интерфейс (с реализацией, соответствующей вашим потребностям):

@protocol ImageEditorViewControllerDelegate;

@interface ImageEditorViewController : UIViewController
@property(nonatomic, strong) UIImage* imageToEdit;

@property(nonatomic, weak) id <ImageEditorViewControllerDelegate> delegate;
@end

@protocol ImageEditorViewControllerDelegate
- (void)imageEditorViewController:(ImageEditorViewController*)imageEditorViewController didFinishWithInfo:(NSDictionary*)info;
@end
person Charles A.    schedule 10.08.2013