iOS 系统相机拍照后图片无法拖拽问题的解决

问题:使用系统相机拍照,并允许编辑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];
}

 网上有很多这类框架,这里就不一一列出了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值