-(void)pan:(UIPanGestureRecognizer*)pan
{
if(pan.state==UIGestureRecognizerStateBegan) {
//获得点击的起点
self.startP=[pan locationInView:self.view];
UIView *clipView=[[UIView alloc]init];
clipView.backgroundColor=[UIColor redColor];
clipView.alpha=0.5;
[self.view addSubview:clipView];
self.clipView=clipView;
}
else if(pan.state==UIGestureRecognizerStateChanged) {
//求偏移量
CGPoint curP=[pan locationInView:self.view];
CGFloat offsetX=curP.x-self.startP.x;
CGFloat offsetY=curP.y-self.startP.y;
//修改好frame值就好了
self.clipView.frame=CGRectMake(self.startP.x,self.startP.y, offsetX, offsetY);
}
else if(pan.state==UIGestureRecognizerStateEnded) {
UIImage *image=[self clipImage:self.imageView withClipRect:self.clipView.frame];
self.imageView.image=image;
//删除多余的部分,就是我们选择时候会加上的那个红色透明的clipView-你们也可以不写,截取的都是没有红色的
[self.clipView removeFromSuperview];
UIImage*icon=[self drawToContext:self.imageView];
UIImageWriteToSavedPhotosAlbum(icon,self,
@selector(image:didFinishSavingWithError:contextInfo:),nil);
}
}
else if(pan.state == UIGestureRecognizerStateEnded) { /**若手势停止,将剪切区域的图片内容绘制到图形上下文中**/ //开启位图上下文 UIGraphicsBeginImageContextWithOptions(self.imageView.bounds.size, NO, 0); //创建大小等于剪切区域大小的封闭路径 UIBezierPath *path = [UIBezierPath bezierPathWithRect:self.clipView.frame]; //设置超出的内容不显示, [path addClip]; //获取绘图上下文 CGContextRef context = UIGraphicsGetCurrentContext(); //将图片渲染的上下文中 [self.imageView.layer renderInContext:context]; //获取上下文中的图片 UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); //关闭位图上下文 UIGraphicsEndImageContext(); //移除剪切区域视图控件,并清空 [self.clipView removeFromSuperview]; self.clipView = nil; //将图片显示到imageView上 self.imageView.image = image; }