0

我需要裁剪图像以匹配特定尺寸。从底部开始,我的视图中有三层:

  1. 我有原始图像在UIImage. 此图像来自相机。(称为cameraImage)
  2. 我有一个UIView拿着这个图像。当用户单击“裁剪”时,UIView 的边界用于裁剪其中的原始图像。
  3. 最重要的是,我有一个指导图像,它向用户展示了他们需要平移、旋转和捏合图像以适应的尺寸。

我想将平移手势添加到顶部指南图像并让它控制底部的原始图像。所以引导图像永远不会移动,但它正在监听平移手势。如果不让我的原始图像跳回零,我无法弄清楚如何重置识别器。也许有人可以帮忙?

- (IBAction)handlePan:(UIPanGestureRecognizer *)recognizer {
CGPoint translation = [recognizer translationInView:recognizer.view];
recognizer.view.center = CGPointMake(recognizer.view.center.x+translation.x, recognizer.view.center.y+ translation.y);
[recognizer setTranslation:CGPointMake(0, 0) inView:recognizer.view];
}

上面的代码在我的手势中效果很好,附在底部图像上。问题是当用户超出视图范围时,图像停止平移并且基本上卡住了。你不能再碰它,所以它就坐在那里。所以我想如果我将手势附加到顶部它会解决这个问题。

- (IBAction)handlePan:(UIPanGestureRecognizer *)recognizer {
CGPoint translation = [recognizer translationInView:recognizer.view];
cameraImage.center = CGPointMake(recognizer.view.center.x+translation.x, recognizer.view.center.y+ translation.y);
}

这几乎可以工作。我设置了 cameraImage 的中心并删除了重置识别器的第三行。如果我不删除它,每次我尝试平移时,cameraImage 都会跳回相同的位置。它几乎可以工作,因为当您再次单击图像时,它不会从您触摸的像素开始。它将图像移回原始位置,然后让您平移。

4

1 回答 1

2

第一种选择:当识别器进入UIGestureRecognizerStateEnded状态时

if(recofnizer.state == UIGestureRecognizerStateEnded )
{
...
}

您将当时的翻译存储在类的实例变量 (@property) 中。

然后您总是将保存的翻译添加到新翻译中。在代码中,这看起来像这样:

 - (IBAction)handlePan:(UIPanGestureRecognizer *)recognizer {
       CGPoint translation = [recognizer translationInView:recognizer.view];
       CGPoint updatedTranslation = CGPointMake(translation.x+self.savedTranslation.x,translation.y+self.savedTranslation.y);
       cameraImage.center = CGPointMake(recognizer.view.center.x+updatedTranslation.x, recognizer.view.center.y+ updatedTranslation.y);
       if(recofnizer.state == UIGestureRecognizerStateEnded )
       {
          self.savedTranslation = updatedTranslation;
       }
}

不要忘记添加@property (nonatomic, assign) CGPoint savedTranslation;到您的界面。还要确保在您的类的 init 方法中初始化 savedTranslation 变量以self.savedTranslation = CGPointMake(0,0);

第二种选择:您应该考虑在滚动视图中使用 imageview 作为滚动视图的 viewForZooming 来做所有您想做的事情。这允许非常流畅的交互,就像用户习惯的那样!

然后,您可以在此滚动视图上方放置您的遮罩/指南,但请确保禁用遮罩/指南视图的 userInteraction 以使您的用户触摸下面的滚动视图!

于 2013-04-10T21:15:01.817 回答