通过手势识别器操作后裁剪 UIImageView

Posted

技术标签:

【中文标题】通过手势识别器操作后裁剪 UIImageView【英文标题】:Crop UIImageView after manipulated through gesture recognizer 【发布时间】:2016-01-12 02:46:54 【问题描述】:

我在解决这个问题时遇到了问题!我看到的所有示例都与滚动视图有关,而我没有使用。在通过捏合、平移和旋转操作图像后,我需要在预定的 CGRect 区域内裁剪图像。我下面的代码在左上角裁剪了未经处理的图像。

澄清 pendantCanvasView 是视图(容器),而 pendantImageView 是 pendantCanvasView 的子类。 PendantFrame 只是一个 CGRect,它具有我要裁剪的 pendantImageView 中的矩形坐标。

有人可以帮我吗?

这是我到目前为止的代码:

- (void)addMoveImageToolbox 

   UIPinchGestureRecognizer *pinchRec = [[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(handlePinch:)];
   [self.pendantCanvasView addGestureRecognizer:pinchRec];

   UIRotationGestureRecognizer *rotateRec = [[UIRotationGestureRecognizer alloc]initWithTarget:self action:@selector(handleRotate:)];
   [self.pendantCanvasView addGestureRecognizer:rotateRec];

   UIPanGestureRecognizer *panRec = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)];
   [self.pendantCanvasView addGestureRecognizer:panRec];


- (void)handlePinch:(UIPinchGestureRecognizer*)pinch 
   self.pendantImageView.transform = CGAffineTransformScale(self.pendantImageView.transform, pinch.scale, pinch.scale);
   self.zoomScale = pinch.scale;
   pinch.scale = 1;


- (void)handleRotate:(UIRotationGestureRecognizer*)rotate 
   self.pendantImageView.transform =   CGAffineTransformRotate(self.pendantImageView.transform, rotate.rotation);
   rotate.rotation = 0;


- (void)handlePan:(UIPanGestureRecognizer *)pan 

   CGPoint translation = [pan translationInView:self.pendantCanvasView];
   self.pendantImageView.center = CGPointMake(self.pendantImageView.center.x + translation.x,
                                     self.pendantImageView.center.y + translation.y);
   [pan setTranslation:CGPointMake(0, 0) inView:self.pendantImageView];

裁剪方法:

- (UIImage *)captureScreenInRect 

   UIGraphicsBeginImageContextWithOptions(pendantFrame.size, NO, [UIScreen mainScreen].scale);
   [self.pendantCanvasView drawViewHierarchyInRect:pendantFrame afterScreenUpdates:YES];
   UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
   UIGraphicsEndImageContext();self.pendantImageView.constraints

   return image;

【问题讨论】:

【参考方案1】:

我相信 drawViewHierarchyInRect 会重新渲染视图层次结构,因此它可能会丢失您对 imageView 的更改。

您可以尝试使用 snapshotViewAfterScreenUpdates。

我不确定 pendantCanvasView、pendantImageView 和 pendantFrame 之间的关系是什么,但可以使用其中一个或另一个的 layer 属性的 renderInContext 方法来获取裁剪后的图像。

【讨论】:

您好,感谢您的回复!我编辑了我的问题来解释这种关系。我不知道这是否有帮助,但我会尝试你的建议。

以上是关于通过手势识别器操作后裁剪 UIImageView的主要内容,如果未能解决你的问题,请参考以下文章

IOS 手势事件的冲突

操作手势后从 UIImageView 保存图像

在 uiimageview 上无法识别点击手势

ui scrollview 中没有手势识别器 uiimageview

图像裁剪为矩形,它应该移动

UIImageView 手势(缩放、旋转)问题