在占位符UIView上使用手势识别器平移UIImage

时间:2013-04-10 20:59:23

标签: ios uigesturerecognizer uipangesturerecognizer

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

  1. 我在UIImage中有原始图片。此图像来自相机。 (称为cameraImage)
  2. 我有UIView持有此图片。当用户点击“裁剪”时,UIView的边界用于裁剪其中的原始图像。
  3. 最重要的是,我有一个指南图像,向用户显示平移,旋转和捏合图像所需的尺寸。
  4. 我想将平移手势添加到顶部引导图像,并让它控制底部的原始图像。因此,引导图像永远不会移动,但它正在监听平移手势。 我无法弄清楚如何在不使原始图像跳回零的情况下重置识别器。也许有人可以提供帮助?

    - (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会跳回到相同的位置。它几乎可以工作,因为当您再次单击图像时,它不会从您触摸的像素开始。它将图像移回原始位置,然后让你平移。

1 个答案:

答案 0 :(得分:2)

第一个选项: 当识别器进入UIGestureRecognizerStateEnded状态

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

您可以在该类的实例varibale(@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;添加到您的界面。 还要确保savedTranslation变量在类的init方法中初始化为self.savedTranslation = CGPointMake(0,0);

第二种选择: 你应该考虑在带有imageview的scrollview中做你想要的所有内容作为scrollview的viewForZooming。这允许非常流畅的交互,就像用户习惯一样!

在此滚动视图上方,您可以放置​​遮罩/指南,但请务必禁用遮罩/指南视图的userInteraction,以使用户触摸下方的滚动视图!