objective-c - 为 UIImagePickerController 裁剪设置最小缩放级别

标签 objective-c cocoa-touch zooming uiimagepickercontroller crop

我正在使用 UIImagePickerController 来允许用户上传照片以在我的应用程序中使用。选择要上传的照片后,系统会提示用户裁剪他/她的照片(因为我已设置 imagePickerController.allowsEditing = YES)。但是,如果照片是风景照片(即宽度大于高度),目前用户可以以不输出方形图像的方式裁剪照片。这是因为裁剪横向照片时的默认缩放级别是 aspectFit 而不是 aspectFill(与纵向照片一样)。

是否可以为 UIImagePickerController 的编辑模式设置最小缩放级别?我想如果输出不是正方形我可以简单地自动裁剪图像,但我宁愿 UIImagePickerController 的编辑模式将其传达给用户而不是为他/她做这件事。

最佳答案

无法调整 UIImagePickerController 的行为以受支持的方式裁剪/编辑功能。您可能会深入研究 UIImagePickerController Controller / View 层次结构并尝试弄清楚它是如何工作的,但这不是一件非常易于维护或令人愉快的事情。

话虽如此,UIImagePickerControllerUINavigationController 的子类, 所以没有什么能阻止你实现自己的图像编辑 View Controller 并将其推送到 UIImagePickerController .这可能不会太难,你可以把挑选出来的 UIImage 扔掉。进入UIScrollView用一个显示裁剪区域的矩形叠加层,做一些数学运算,然后裁剪 UIImage你自己。在这种情况下,您显然可以完全控制功能,我敢打赌,与深入研究 UIImagePickerController 相比,实现起来花费的时间更少。 .

我可能会将其设置为像这样呈现选择器的任何 View Controller :

@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

然后您的编辑 View 将具有这样的界面(具有特定于您的需求的实现):

@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

关于objective-c - 为 UIImagePickerController 裁剪设置最小缩放级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13845949/

相关文章:

iphone - 我是否必须在 applicationWillTerminate 中停止 Google Analytics 跟踪器? (iOS)

objective-c - 如何在 Objective-C 中使用 SQLite3 中的保存点

ios - subview 的约束在 iOS 8、XCode 6 (6A313) 中不起作用。适用于 iOS 7

javascript - 缩小谷歌地图的事件?

c++ - 将 float 的最接近的整数次幂向下舍入

ios - 将 URL 转换为超链接

objective-c - cocoa 回调设计 : Best Practice

iphone - UIView 与 UIViewController

ios - 在 UIPickerView 出现之前加载数据

css - 将鼠标悬停在一个 DIV 上以缩放另一个 DIV