// // HQImageEditViewController.m // CivilAviation // // Created by iOS on 2019/3/29. // Copyright © 2019 iOS. All rights reserved. // #import "HQImageEditViewController.h" #import "HQEditImageActionView.h" #import "HQEditImageCaptureView.h" #import "HQEditImageEditView.h" #import "Masonry.h" static inline UIEdgeInsets hq_safeAreaInset() { if (@available(iOS 11.0, *)) { return [UIApplication sharedApplication].keyWindow.safeAreaInsets; } return UIEdgeInsetsZero; } @interface HQImageEditViewController () @property (nonatomic, strong) HQEditImageCaptureView *captureView; @property (nonatomic, strong) UIScrollView *scrollView; @property (nonatomic, strong) UIImageView *imageView; @property (nonatomic, strong) HQEditImageActionView *actionView; @property (nonatomic, strong) HQEditImageEditView *editView; @property (nonatomic, assign) NSInteger rotateTimes; @property (nonatomic, assign) CGSize imageViewOriginSize; @property (nonatomic, assign) BOOL showNavigationBarWhenPop; //@property (nonatomic, strong) UIImage * originalImage; @property (nonatomic, strong) NSString* mCropPicturePath; @end @implementation HQImageEditViewController{ NSString * textCancel; NSString * textSelect; } - (instancetype)initWithImage:(UIImage *)originalImage delegate:(id)delegate { self = [super init]; if (self) { _delegate = delegate; _originImage = originalImage; } return self; } - (void)viewDidLoad { [super viewDidLoad]; // self.hq_navigationBarHide = YES; self.view.backgroundColor = UIColor.blackColor; self.view.layer.masksToBounds = YES; [self initLlanguage]; [self initData]; [self.view addSubview:self.captureView]; [self.captureView addSubview:self.scrollView]; [self.scrollView addSubview:self.imageView]; [self.view addSubview:self.actionView]; [self.view addSubview:self.editView]; [self.actionView.cancelButton setTitle:textCancel forState:UIControlStateNormal]; [self.actionView.finishButton setTitle:textSelect forState:UIControlStateNormal]; } -(void)initData{ if(_mRATIO_X <= 0){ _mRATIO_X = 1; } if(_mRATIO_Y <= 0){ _mRATIO_Y = 1; } if(_mCropFileName == nil || _mCropFileName.length == 0 ){ _mCropFileName = @"hdl_headPicture"; } CGFloat height = self.view.bounds.size.width*_mRATIO_Y/_mRATIO_X; _editViewSize = CGSizeMake(self.view.bounds.size.width, height); } -(void)initLlanguage{ NSString *languageName = [[[NSUserDefaults standardUserDefaults] objectForKey:@"AppleLanguages"] objectAtIndex:0]; // 简体中文 if ([languageName rangeOfString:@"zh-Hans"].location != NSNotFound) { textCancel = @"取消"; textSelect = @"选取"; }else{ textCancel = @"Cancel"; textSelect = @"Select"; } } - (void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; [self.captureView mas_makeConstraints:^(MASConstraintMaker *make) { make.width.equalTo(@(self.editViewSize.width)); make.height.equalTo(@(self.editViewSize.height)); make.top.equalTo(@((CGFloat)(hq_safeAreaInset().top + self.topSpace))); make.centerX.equalTo(@0); }]; [self.actionView mas_makeConstraints:^(MASConstraintMaker *make) { make.left.right.bottom.equalTo(@0); make.height.equalTo(@(49*2 + hq_safeAreaInset().bottom)); }]; [self.editView mas_makeConstraints:^(MASConstraintMaker *make) { make.width.equalTo(@(self.editViewSize.width)); make.height.equalTo(@(self.editViewSize.height)); make.top.equalTo(@((CGFloat)(hq_safeAreaInset().top + self.topSpace))); make.centerX.equalTo(@0); }]; } - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; // if (self.navigationController.isNavigationBarHidden == NO) { // [self.navigationController setNavigationBarHidden:YES animated:YES]; // self.showNavigationBarWhenPop = YES; // } } - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; // if (self.showNavigationBarWhenPop) { // [self.navigationController setNavigationBarHidden:NO animated:YES]; // } } - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; [self.editView maskViewShowWithDuration:.2f]; // self.navigationController.interactivePopGestureRecognizer.enabled = NO; } - (void)viewDidDisappear:(BOOL)animated { [super viewDidDisappear:animated]; // self.navigationController.interactivePopGestureRecognizer.enabled = YES; } - (UIInterfaceOrientationMask)supportedInterfaceOrientations { return UIInterfaceOrientationMaskPortrait; } #pragma mark - UIScrollViewDelegate - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView { [self.editView maskViewHideWithDuration:.2f]; } - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { [self.editView maskViewShowWithDuration:.2f]; } - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate { if (!decelerate) { [self.editView maskViewShowWithDuration:.2f]; } } - (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view { [self.editView maskViewHideWithDuration:.2f]; } - (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView { return self.imageView; } - (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scale { [self.scrollView setZoomScale:scale animated:NO]; [self.editView maskViewShowWithDuration:.2f]; } #pragma mark - HQEditImageActionViewDelegate - (void)action:(HQEditImageActionView *)action didClickButton:(UIButton *)button atIndex:(NSInteger)index { if (index == 0) { // 旋转 self.rotateTimes ++; self.captureView.rotateTimes = self.rotateTimes; [self rotateScrollView:self.rotateTimes]; } else if (index == 1) { // 取消 // if ([self.delegate respondsToSelector:@selector(editControllerDidClickCancel:)]) { // [self.delegate editControllerDidClickCancel:self]; // } // if (_delegate && [_delegate respondsToSelector:@selector(cropImageDidFinishedWithImage:bSuccess:)]) { [_delegate cropImageDidFinishedWithImage:nil bSuccess:NO]; } // [self.navigationController popViewControllerAnimated:YES]; [self dismissViewControllerAnimated:YES completion:nil]; } else if (index == 2) { // 还原 [self originAll]; } else if (index == 3) { // 完成 if (self.scrollView.isDragging || self.scrollView.isDecelerating || self.scrollView.isZoomBouncing) { return; } // UIImage *image = [self.captureView captureImage]; // UIImage *originImage = [self.captureView captureOriginalImage]; UIImage *originImage2 = [self compressImageSize:image toByte:200*1024]; NSString* saveSuccessath = [self saveImage:originImage2]; BOOL saveSuccess = NO; if(![saveSuccessath isEqualToString:@""]){ saveSuccess = YES; } if (_delegate && [_delegate respondsToSelector:@selector(cropImageDidFinishedWithImage:bSuccess:)]) { [_delegate cropImageDidFinishedWithImage:saveSuccessath bSuccess:saveSuccess]; } [self dismissViewControllerAnimated:YES completion:nil]; } } //图片压缩 - (UIImage *)compressImageSize:(UIImage *)image toByte:(NSUInteger)maxLength { UIImage *resultImage = image; NSData *data = UIImageJPEGRepresentation(resultImage, 1); NSUInteger lastDataLength = 0; while (data.length > maxLength && data.length != lastDataLength) { lastDataLength = data.length; CGFloat ratio = (CGFloat)maxLength / data.length; CGSize size = CGSizeMake((NSUInteger)(resultImage.size.width * sqrtf(ratio)), (NSUInteger)(resultImage.size.height * sqrtf(ratio))); // Use NSUInteger to prevent white blank UIGraphicsBeginImageContext(size); // Use image to draw (drawInRect:), image is larger but more compression time // Use result image to draw, image is smaller but less compression time [resultImage drawInRect:CGRectMake(0, 0, size.width, size.height)]; resultImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); data = UIImageJPEGRepresentation(resultImage, 1); } return resultImage; } -(NSString*)saveImage:(UIImage*)mImage{ NSString* _mCropPicturePath = @""; NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES); NSString *filePath = [[paths objectAtIndex:0]stringByAppendingPathComponent: [NSString stringWithFormat:@"%@%@", _mCropFileName, @".Png"]]; // 保存文件的名称 BOOL result = [UIImagePNGRepresentation(mImage)writeToFile:filePath atomically:YES]; // 保存成功会返回YES if (result == YES) { _mCropPicturePath = filePath; NSLog(@"保存成功"); }else{ _mCropPicturePath = @""; } return _mCropPicturePath; } #pragma mark - HQEditImageEditViewDelegate - (void)editView:(HQEditImageEditView *)editView anchorPointIndex:(NSInteger)anchorPointIndex rect:(CGRect)rect { CGRect imageEditRect = [self.captureView convertRect:rect toView:self.imageView]; [self.scrollView zoomToRect:imageEditRect animated:YES]; } #pragma mark - private method - (void)rotateScrollView:(NSInteger)times { self.view.userInteractionEnabled = NO; [UIView animateWithDuration:.3f animations:^{ self.scrollView.transform = CGAffineTransformRotate(self.scrollView.transform, -M_PI_2); } completion:^(BOOL finished) { if (self.editViewSize.width != self.editViewSize.height) { [self.scrollView setZoomScale:1.f animated:YES]; [self.scrollView setContentOffset:CGPointMake(0, 0) animated:YES]; [UIView animateWithDuration:.3f animations:^{ self.scrollView.frame = CGRectMake(0, 0, self.editViewSize.width, self.editViewSize.height); if (times % 2 == 1) { if (self.editViewSize.width * (self.imageViewOriginSize.width/self.imageViewOriginSize.height) >= self.editViewSize.height) { self.imageView.frame = CGRectMake(0, 0, self.editViewSize.width * (self.imageViewOriginSize.width/self.imageViewOriginSize.height), self.editViewSize.width); //宽拉满 } else { self.imageView.frame = CGRectMake(0, 0, self.editViewSize.height, self.editViewSize.height * (self.imageViewOriginSize.height/self.imageViewOriginSize.width)); //高拉满 } } else { self.imageView.frame = CGRectMake(0, 0, self.imageViewOriginSize.width, self.imageViewOriginSize.height); } } completion:^(BOOL finished) { self.scrollView.contentSize = self.imageView.frame.size; self.view.userInteractionEnabled = YES; }]; } else { self.view.userInteractionEnabled = YES; } }]; } - (void)originAll { self.rotateTimes = 0; self.captureView.rotateTimes = 0; [self.scrollView setZoomScale:1]; self.scrollView.transform = CGAffineTransformIdentity; self.scrollView.frame = CGRectMake(0, 0, self.editViewSize.width, self.editViewSize.height); self.imageView.frame = CGRectMake(0, 0, self.imageViewOriginSize.width, self.imageViewOriginSize.height); self.scrollView.contentSize = self.imageView.frame.size; self.scrollView.contentOffset = CGPointMake(0, 0); } #pragma mark - override - (BOOL)prefersStatusBarHidden { return YES; } #pragma mark - getter & setter - (CGFloat)topSpace { return (([[UIScreen mainScreen] bounds].size.height) - hq_safeAreaInset().top - hq_safeAreaInset().bottom - 49*2 - self.editViewSize.height)/2.f; } - (CGFloat)leftSpace { return (([[UIScreen mainScreen] bounds].size.width) - self.editViewSize.width)/2.f; } - (CGFloat)rightSpace { return (([[UIScreen mainScreen] bounds].size.width) - self.editViewSize.width)/2.f; } - (CGFloat)bottomSpace { return (([[UIScreen mainScreen] bounds].size.height) - hq_safeAreaInset().top - hq_safeAreaInset().bottom - 49*2 - self.editViewSize.height)/2.f; } - (CGSize)editViewSize { if (_editViewSize.width == 0 && _editViewSize.height == 0) { return CGSizeMake((CGFloat)(([[UIScreen mainScreen] bounds].size.width) - 20*2), (CGFloat)(([[UIScreen mainScreen] bounds].size.width) - 20*2)); } else { return _editViewSize; } } - (CGSize)imageViewOriginSize { if (self.editViewSize.width/self.originImage.size.width > self.editViewSize.height/self.originImage.size.height) { return CGSizeMake(self.editViewSize.width, (CGFloat)((self.originImage.size.height/self.originImage.size.width)*self.editViewSize.width)); //宽 } else { return CGSizeMake((CGFloat)((self.originImage.size.width/self.originImage.size.height)*self.editViewSize.height), self.editViewSize.height); //高 } } - (HQEditImageCaptureView *)captureView { if (!_captureView) { _captureView = [[HQEditImageCaptureView alloc] init]; _captureView.captureView = self.scrollView; _captureView.imageView = self.imageView; } return _captureView; } - (UIScrollView *)scrollView { if (!_scrollView) { _scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.editViewSize.width, self.editViewSize.height)]; _scrollView.delegate = self; _scrollView.layer.masksToBounds = NO; _scrollView.minimumZoomScale = 1.f; _scrollView.maximumZoomScale = 10.f; _scrollView.zoomScale = 1.f; _scrollView.showsVerticalScrollIndicator = NO; _scrollView.showsHorizontalScrollIndicator = NO; _scrollView.decelerationRate = UIScrollViewDecelerationRateFast; _scrollView.contentInset = UIEdgeInsetsZero; _scrollView.contentSize = CGSizeMake(self.imageViewOriginSize.width, self.imageViewOriginSize.height); if (@available(iOS 11.0, *)) { _scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; } else { // Fallback on earlier versions } } return _scrollView; } - (UIImageView *)imageView { if (!_imageView) { _imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.imageViewOriginSize.width, self.imageViewOriginSize.height)]; _imageView.image = self.originImage; _imageView.contentMode = UIViewContentModeScaleAspectFill; } return _imageView; } - (HQEditImageActionView *)actionView { if (!_actionView) { _actionView = [[HQEditImageActionView alloc] init]; _actionView.delegate = self; } return _actionView; } - (HQEditImageEditView *)editView { if (!_editView) { _editView = [[HQEditImageEditView alloc] initWithMargin:UIEdgeInsetsMake(self.topSpace + hq_safeAreaInset().top, self.leftSpace, self.bottomSpace, self.rightSpace) size:CGSizeMake(self.editViewSize.width, self.editViewSize.height)]; _editView.delegate = self; _editView.maskViewAnimation = self.maskViewAnimation; } return _editView; } @end