我正在构建一个 iPhone 应用程序。我有一个 UIView 包含一组 UIImageView 子类对象。用户可以通过触摸拖动和旋转图像视图。旋转图像视图后,我无法移动它。
为了旋转图像视图,我应用了变换旋转,效果很好。它看起来像这样:
CGAffineTransform trans = self.transform;
self.transform = CGAffineTransformRotate(trans, delta);
当用户尝试通过触摸移动元素时,问题就会出现。在 touchesBegan:WithEvent: 中,我将起点保存在类变量 startLocation 中:
- (void) touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event
{
// Retrieve the touch point
CGPoint pt = [[touches anyObject] locationInView:self];
startLocation = pt;
}
在 touchesMoved:withEvent: 中,我有以下代码,如果图像视图上没有旋转变换,它就可以很好地工作:
- (void) touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event
{
CGPoint pt = [[touches anyObject] locationInView:self];
CGFloat dx = pt.x - startLocation.x;
CGFloat dy = pt.y - startLocation.y;
CGPoint newCenter = CGPointMake(self.center.x + dx, self.center.y + dy);
self.center = newCenter;
}
但是如果图像视图上有一个旋转变换,那么图像视图在每个 touchesMoved 事件上都会在屏幕上晃动并很快消失。在调试器中,我观察到 pt 的值变得很可怕。我突然想到我需要改变这一点,我做到了,就像这样:
- (void) touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event
{
CGPoint pt = [[touches anyObject] locationInView:self];
if (!CGAffineTransformIsIdentity(self.transform)) {
pt = CGPointApplyAffineTransform(pt, self.transform);
}
CGFloat dx = pt.x - startLocation.x;
CGFloat dy = pt.y - startLocation.y;
CGPoint newCenter = CGPointMake(self.center.x + dx, self.center.y + dy);
}
这工作得更好。我现在可以拖动有关屏幕的图像。但是第一次移动会导致图像在一个方向或另一个方向上摇晃一次,具体取决于变换中的旋转角度和图像视图的尺寸。
如何在没有初始颠簸的情况下移动图像视图?
为什么我不需要转换 startLocation (触摸开始时我捕获的点)?