2012-07-11 114 views
0

我有一个UIImageView有一个箭头的图像。当用户点击UIView时,这个箭头应该指向水龙头保持其位置的方向,它应该改变变换。我已经实现了以下代码。但它没有按预期工作。我添加了一个截图。在这个屏幕截图中,当我触摸左上方的点时,箭头方向应该如图所示。但它不会发生。UIImageView旋转动画在触摸方向

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 

UITouch *touch=[[event allTouches]anyObject]; 
touchedPoint= [touch locationInView:touch.view]; 
imageViews.transform = CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(rangle11)); 
previousTouchedPoint = touchedPoint ; 
} 

- (CGFloat) pointPairToBearingDegrees:(CGPoint)startingPoint secondPoint:(CGPoint) endingPoint 
{ 

CGPoint originPoint = CGPointMake(endingPoint.x - startingPoint.x, endingPoint.y - startingPoint.y); // get origin point to origin by subtracting end from start 
    float bearingRadians = atan2f(originPoint.y, originPoint.x); // get bearing in radians 
float bearingDegrees = bearingRadians * (180.0/M_PI); // convert to degrees 
bearingDegrees = (bearingDegrees > 0.0 ? bearingDegrees : (360.0 + bearingDegrees)); // correct discontinuity 
return bearingDegrees; 
} 

enter image description here

+0

请让我们知道如何为未按预期工作。箭头是否指向正确的方向?它围绕错误的轴旋转吗? – 2012-07-11 13:11:52

+0

是的,它没有指向正确的方向。当我触摸UIView上的另一点时,此箭头指向另一个方向。 – 2012-07-12 03:50:17

+0

你的形象指向哪个方式?向上? – nielsbot 2012-07-17 07:31:13

回答

4

我假设你想要一个箭头图像指向你触摸的地方,我试过了,这是我能想出来的。我用一个向上的箭头(没有尝试从任何其他位置开始尝试,日志给出正确的角度)放置图像视图,并在它旋转的不同位置触摸并指向触摸位置。希望它可以帮助(尝试了一些旧的数学:-))

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 

    UITouch *touch=[[event allTouches]anyObject]; 
    touchedPoint= [touch locationInView:touch.view]; 
    CGFloat angle = [self getAngle:touchedPoint]; 
    imageView.transform = CGAffineTransformMakeRotation(angle); 

} 

-(CGFloat) getAngle: (CGPoint) touchedPoints 
{ 
    CGFloat x1 = imageView.center.x; 
    CGFloat y1 = imageView.center.y; 

    CGFloat x2 = touchedPoints.x; 
    CGFloat y2 = touchedPoints.y; 

    CGFloat x3 = x1; 
    CGFloat y3 = y2; 

    CGFloat oppSide = sqrtf(((x2-x3)*(x2-x3)) + ((y2-y3)*(y2-y3))); 
    CGFloat adjSide = sqrtf(((x1-x3)*(x1-x3)) + ((y1-y3)*(y1-y3))); 

    CGFloat angle = atanf(oppSide/adjSide); 
    // Quadrant Identifiaction 
    if(x2 < imageView.center.x) 
    { 
     angle = 0-angle; 
    } 


    if(y2 > imageView.center.y) 
    { 
     angle = M_PI/2 + (M_PI/2 -angle); 
    } 
    NSLog(@"Angle is %2f",angle*180/M_PI); 
    return angle; 

} 

-anoop4real

+0

这个答案完全适用于向上的箭头,但为什么它不适用于任何其他方向? – 2012-07-23 04:10:29

+0

嗨,这是我使用的想法,我画了两条垂直线,水平通过图像中心,现在我编码,使得通过图像中心画出的垂直线与图像视图帧一起指向您点击的方向。尝试放置任何图像并观察图像帧,您可以看到它指向轻敲的方向,它只是图像的位置,让你觉得它不是指向右侧的目录。希望你明白,我可以发表一些我用过的笔记,现在没有。 – anoop4real 2012-07-23 05:16:09

1

鉴于你告诉我,我认为这个问题是你是不是重置您在touchesBegan变换。尝试改变它到这样的事情,看看它是否更好地工作:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 

UITouch *touch=[[event allTouches]anyObject]; 
touchedPoint= [touch locationInView:touch.view]; 
imageViews.transform = CGAffineTransformIdentity; 
imageViews.transform = CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(rangle11)); 
previousTouchedPoint = touchedPoint ; 
} 
+0

问题是相同的,它会旋转到任何其他方向。 – 2012-07-13 03:52:35

1

你是否需要行“去除不连续性”?似乎atan2f()返回+π到-π之间的值。那些不会直接使用CATransform3DMakeRotation()

+0

另外,'-touchesBegan'只会被调用一次 - 您还需要覆盖'-touchesMoved'以不断更新。 (并且确保你所有的超级选项都是“超级”的 – nielsbot 2012-07-17 07:35:36

1

你需要的是箭头指向最后一个点击点。为了简化和测试,我使用了轻敲手势(但它与touchBegan类似:withEvent :)。

在viewDidLoad方法,我注册的手势:

 
- (void)tapped:(UITapGestureRecognizer *)gesture 
{ 
    CGPoint imageCenter = mFlecheImageView.center; 
    CGPoint tapPoint = [gesture locationInView:self.view]; 

    double deltaY = tapPoint.y - imageCenter.y; 
    double deltaX = tapPoint.x - imageCenter.x; 
    double angleInRadians = atan2(deltaY, deltaX) + M_PI_2; 

    mFlecheImageView.transform = CGAffineTransformMakeRotation(angleInRadians); 
} 

一个关键是+ M_PI_2因为UIKit的坐标具有在左上角的原点:

 
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapped:)]; 
[self.view addGestureRecognizer:tapGesture]; 
[tapGesture release]; 

呼吁每个抽头的方法拐角(在三角函数中,我们使用左下角)。

+0

谢谢,但同样的问题,那个箭头指向任何随机的方向 – 2012-07-19 06:42:44

+0

这里是我创建的测试项目:http://dl.free.fr/e6PJtrhnr也许我误解了你的问题 – 2012-07-20 09:22:20