问题:使用系统相机拍照,并允许编辑allowsEditing = YES,但在图片编辑界面只可以对图片进行缩放却无法拖拽。
大牛给出了解决方案,我用着是好使👇🏻👇🏻👇🏻
https://stackoverflow.com/questions/12630155/uiimagepicker-allowsediting-stuck-in-center/53440254#53440254
创建如下的分类文件,并导入到所需要的页面。
// .h文件
#import <UIKit/UIKit.h>
@interface UIImagePickerController (GJImagePickerVC)
- (void)fixCannotMoveEditingBox;
@end
#import "UIImagePickerController+GJImagePickerVC.h"
@implementation UIImagePickerController (GJImagePickerVC)
- (UIScrollView *)findScrollViewFrom:(UIView *)view {
if ([view isKindOfClass:UIScrollView.class]) {
return (UIScrollView *)view;
}
for (UIView *tempView in view.subviews) {
UIView *view = [self findScrollViewFrom:tempView];
if ([view isKindOfClass:UIScrollView.class]) {
return (UIScrollView *)view;
}
}
return nil;
}
- (UIView *)findCropViewFrom:(UIView *)view {
CGFloat screenWidth = [UIScreen mainScreen].bounds.size.width;
CGSize size = view.bounds.size;
if (screenWidth == size.height && screenWidth == size.height) {
return view;
}
for (UIView *tempView in view.subviews) {
UIView *view = [self findCropViewFrom:tempView];
if (view) return view;
}
return nil;
}
- (void)fixCannotMoveEditingBox {
UIView *cropView = [self findCropViewFrom:self.view];
UIScrollView *scrollView = [self findScrollViewFrom:self.view];
if (cropView && scrollView && scrollView.contentOffset.y == 0) {
CGFloat top = CGRectGetMinY(cropView.frame);
CGFloat bottom = scrollView.frame.size.height - cropView.frame.size.height - top;
scrollView.contentInset = UIEdgeInsetsMake(top, 0, bottom, 0);
CGFloat offset = 0;
if (scrollView.contentSize.height > scrollView.contentSize.width) {
offset = 0.5 * (scrollView.contentSize.height - scrollView.contentSize.width);
}
scrollView.contentOffset = CGPointMake(0, -top + offset);
}
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self fixCannotMoveEditingBox];
});
}
@end
// 使用
UIImagePickerController *pickerVC = [UIImagePickerController new];
[pickerVC fixCannotMoveEditingBox];
// 其他配置
// ...
[self presentViewController:pickerVC animated:YES completion:nil];
该方法是对系统自带的BUG做出适配性调整。但由于iOS12系统的系统拍照的层级结构并不一致,所以该方法不适用于iOS12系统。
如果想彻底解决所有问题,只能自己编写编辑相片页面或引入第三方框架,来实现无限制的拍照裁剪功能。例如下方代码所示。
#pragma UIImagePickerController Delegate
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
UIImage *portraitImg = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
YYImageClipViewController *imgClipVC = [[YYImageClipViewController alloc] initWithImage:portraitImg cropFrame:CGRectMake(0, 100.0f, self.view.frame.size.width, self.view.frame.size.width) limitScaleRatio:3.0];
imgClipVC.delegate = self;
[picker pushViewController:imgClipVC animated:NO];
}
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
[picker dismissViewControllerAnimated:YES completion:nil];
}
- (void)imageClip:(YYImageClipViewController *)clipViewController didFinished:(UIImage *)editedImage
{
//保存图片
NSString *imageFilePath = [UIImage saveImage:editedImage];
//上传到自家服务器
[self upImageFilePath:imageFilePath];
//隐藏裁剪界面
[clipViewController dismissViewControllerAnimated:YES completion:nil];
}
- (void)imageClipDidCancel:(YYImageClipViewController *)clipViewController
{
[clipViewController dismissViewControllerAnimated:YES completion:nil];
}
网上有很多这类框架,这里就不一一列出了。