我需要裁剪图像以匹配特定尺寸。从底部开始,我的视图中有三层:
UIImage
中有原始图片。此图像来自相机。 (称为cameraImage)UIView
持有此图片。当用户点击“裁剪”时,UIView的边界用于裁剪其中的原始图像。我想将平移手势添加到顶部引导图像,并让它控制底部的原始图像。因此,引导图像永远不会移动,但它正在监听平移手势。 我无法弄清楚如何在不使原始图像跳回零的情况下重置识别器。也许有人可以提供帮助?
- (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会跳回到相同的位置。它几乎可以工作,因为当您再次单击图像时,它不会从您触摸的像素开始。它将图像移回原始位置,然后让你平移。
答案 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,以使用户触摸下方的滚动视图!