// // WFTailoringViewController.m // WFPhotoPicker // // Created by 赚发2 on 16/9/2. // Copyright © 2016年 fengwang. All rights reserved. // #import "WFTailoringViewController.h" #import #import "WFPhotoAlbum.h" static CGFloat rectWidth = 300; static CGFloat rectHeight = 168; @interface WFTailoringViewController () //原图imageView @property (nonatomic, strong) UIImageView *tailorImageView; //image @property (nonatomic, strong) UIImage *showImage; @end @implementation WFTailoringViewController #pragma mark - UIViewController life cycle - - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. [self private_setupViews]; [self private_showImage]; } #pragma mark - event response - - (void)panAction:(UIPanGestureRecognizer *)panGesture{ CGFloat width = self.view.frame.size.width; CGFloat height = self.view.frame.size.height; CGPoint translation = [panGesture translationInView:panGesture.view.superview]; panGesture.view.center = CGPointMake(panGesture.view.center.x + translation.x, panGesture.view.center.y + translation.y); [panGesture setTranslation:CGPointZero inView:panGesture.view.superview]; //不能上出选择框 if (panGesture.view.frame.origin.x >= (width - rectWidth ) / 2){ panGesture.view.frame = CGRectMake((width - rectWidth ) / 2, panGesture.view.frame.origin.y, panGesture.view.frame.size.width, panGesture.view.frame.size.height); }; //不能右出选择框 if (panGesture.view.frame.origin.y >= (height - rectHeight) / 2) { panGesture.view.frame = CGRectMake(panGesture.view.frame.origin.x, (height - rectHeight) / 2, panGesture.view.frame.size.width, panGesture.view.frame.size.height); } CGFloat scaleH = panGesture.view.frame.size.height; //不能下出选择框 if (panGesture.view.frame.origin.y <= -(scaleH - (height - rectHeight) / 2 - rectHeight)) { panGesture.view.frame = CGRectMake(panGesture.view.frame.origin.x, -(scaleH - (height - rectHeight) / 2 - rectHeight) ,panGesture.view.frame.size.width, panGesture.view.frame.size.height); } CGFloat scaleW = panGesture.view.frame.size.width; //不能右出选择框 if (panGesture.view.frame.origin.x <= -(scaleW - (width - rectWidth) / 2 - rectWidth)) { panGesture.view.frame = CGRectMake(-(scaleW - (width - rectWidth) / 2 - rectWidth), panGesture.view.frame.origin.y, panGesture.view.frame.size.width, panGesture.view.frame.size.height); } } - (void)pinchAction:(UIPinchGestureRecognizer *)pinchGesture{ pinchGesture.view.transform = CGAffineTransformScale(pinchGesture.view.transform, pinchGesture.scale, pinchGesture.scale); //确保不能放大过大或过小 //2D 矩阵:ad缩放bc旋转tx,ty位移 //规则:x=ax+cy+tx // y=bx+dy+ty if (pinchGesture.view.transform.a > 1.5) { CGAffineTransform transform = pinchGesture.view.transform; transform.a = 1.5; transform.d = 1.5; pinchGesture.view.transform = transform; } if (pinchGesture.view.transform.a < 0.80) { CGAffineTransform transform = pinchGesture.view.transform; transform.a = 0.80; transform.d = 0.80; pinchGesture.view.transform = transform; } pinchGesture.scale = 1; } - (void)sureSelectedImage:(UIButton *)sender{ UIImage *image = [self private_captureImageFromView:self.view]; _tailoredImage ? _tailoredImage(image) : nil; [self dismissViewControllerAnimated:YES completion:nil]; } #pragma mark - private methods - - (void)private_setupViews{ self.view.backgroundColor = [UIColor blackColor]; //选择图片 _tailorImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 0)]; _tailorImageView.userInteractionEnabled = YES; [self.view addSubview:_tailorImageView]; //选择框 [self private_setupBoxLayer]; UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panAction:)]; [_tailorImageView addGestureRecognizer:panGesture]; UIPinchGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchAction:)]; [_tailorImageView addGestureRecognizer:pinchGesture]; //底部视图 UIView *toolView = [[UIView alloc] initWithFrame:CGRectMake(0, self.view.frame.size.height - 50, self.view.frame.size.width, 50)]; [self.view addSubview:toolView]; toolView.backgroundColor = [UIColor whiteColor]; UIButton *sureButton = [UIButton buttonWithType:UIButtonTypeCustom]; sureButton.frame = CGRectMake(self.view.frame.size.width - 80, 5, 60, 40); sureButton.backgroundColor = [UIColor colorWithRed:110 / 255.0 green:204 / 255.0 blue:245 / 255.0 alpha:1]; [sureButton setTitle:@"确定" forState: UIControlStateNormal]; [sureButton addTarget:self action:@selector(sureSelectedImage:) forControlEvents:UIControlEventTouchUpInside]; sureButton.layer.cornerRadius = 5; sureButton.layer.masksToBounds = YES; [toolView addSubview:sureButton]; } - (void)private_setupBoxLayer{ CGFloat width = self.view.frame.size.width; CGFloat height = self.view.frame.size.height; [self private_addShapeLayerWithFrame:CGRectMake(0, 0, width, (height - rectHeight) / 2) strokeColor:[UIColor clearColor] fillColor:[UIColor colorWithWhite:0.2 alpha:0.2]]; [self private_addShapeLayerWithFrame:CGRectMake(0, (height - rectHeight) / 2, (width - rectWidth) / 2, rectHeight) strokeColor:[UIColor clearColor] fillColor:[UIColor colorWithWhite:0.2 alpha:0.2]]; [self private_addShapeLayerWithFrame:CGRectMake(0, height / 2 + rectHeight / 2, width, height / 2 - rectHeight / 2) strokeColor:[UIColor clearColor] fillColor:[UIColor colorWithWhite:0.2 alpha:0.2]]; [self private_addShapeLayerWithFrame:CGRectMake((width - rectWidth) / 2 + rectWidth, height / 2 - rectHeight / 2 , width - rectWidth - (width - rectWidth) / 2, rectHeight) strokeColor:[UIColor clearColor] fillColor:[UIColor colorWithWhite:0.2 alpha:0.2]]; [self private_addShapeLayerWithFrame:CGRectMake((width - rectWidth) / 2, height / 2 - rectHeight / 2, rectWidth, rectHeight) strokeColor:[UIColor lightGrayColor] fillColor:[UIColor clearColor]]; } - (void)private_addShapeLayerWithFrame:(CGRect)frame strokeColor:(UIColor *)strokeColor fillColor:(UIColor *)fillColor{ UIBezierPath *rectRangePath = [UIBezierPath bezierPathWithRect:frame]; rectRangePath.lineWidth = 1; CAShapeLayer *shapeLayer = [CAShapeLayer layer]; shapeLayer.frame = self.view.bounds; [self.view.layer insertSublayer:shapeLayer above:_tailorImageView.layer]; shapeLayer.strokeColor = strokeColor.CGColor; shapeLayer.fillColor = fillColor.CGColor; shapeLayer.path = rectRangePath.CGPath; } - (void)private_showImage{ [[WFPhotoAlbum standarWFPhotosAlbum] getPhotosWithAsset:_asset originalImage:YES completion:^(UIImage *image) { CGFloat height = _tailorImageView.frame.size.width * image.size.height / image.size.width; _tailorImageView.frame = CGRectMake(0, 0, _tailorImageView.frame.size.width, height); _tailorImageView.center = self.view.center; _tailorImageView.image = image; }]; } - (UIImage *)private_captureImageFromView:(UIView *)view{ CGRect screenRect = CGRectMake((self.view.frame.size.width - rectWidth) / 2, (self.view.frame.size.height - rectHeight) / 2, rectWidth, rectHeight); UIGraphicsBeginImageContextWithOptions(screenRect.size, NO, [UIScreen mainScreen].scale); CGContextRef context = UIGraphicsGetCurrentContext(); if (context == NULL){ return nil; } //copy 一份图形上下位文,用来操作 CGContextSaveGState(context); //将当前图行位文进行矩阵变换 CGContextTranslateCTM(context, -screenRect.origin.x, -screenRect.origin.y); if( [view respondsToSelector:@selector(drawViewHierarchyInRect:afterScreenUpdates:)]){ //捕捉当前快照 [view drawViewHierarchyInRect:view.bounds afterScreenUpdates:NO]; }else{ //layer 层渲染 [view.layer renderInContext:context]; } //图形位文退出栈 CGContextRestoreGState(context); UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return image; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end