通过滑动旋转箭头

时间:2013-01-29 12:56:59

标签: objective-c cocoa-touch animation

我有一个复杂的问题。我正在为iOS制作一个twister游戏。您可以用手指拖动滚轮的箭头。现在,当用户滑动时,我不想让它旋转。

假设我慢慢旋转箭头然后它应该缓慢移动,最后它应该停止,或者当用户尽可能快地滑动时箭头应该尽可能快地旋转。

目前我有这个代码使箭头可以拖动。

我该怎么做这个动画?

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    gestureStartPoint = [touch locationInView:self.view];

    CGPoint startPoint = CGPointMake(arrowImage.center.x, arrowImage.center.y);

    CGPoint endPoint = CGPointMake(gestureStartPoint.x, gestureStartPoint.y);

    angleStartVal = ((((atan2((endPoint.y - startPoint.y) , (endPoint.x - startPoint.x)))*180)/M_PI)+90);

    timerStart = CFAbsoluteTimeGetCurrent();

}

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

    UITouch *touch = [touches anyObject];
    CGPoint currentPosition = [touch locationInView:self.view];

    CGPoint startPoint = CGPointMake(arrowImage.center.x, arrowImage.center.y);
    CGPoint endPoint = CGPointMake(currentPosition.x, currentPosition.y);

    angleVal = ((((atan2((endPoint.y - startPoint.y) , (endPoint.x - startPoint.x)))*180)/M_PI)+90);
    arrowImage.transform = CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(angleVal));

     //NSLog(@"angle: %f",angleVal);

}

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

}

2 个答案:

答案 0 :(得分:4)

如果你希望它减速直到它停止,那么我将通过一个不可见的scrollView来控制它来实现它。

滑动时UIScrollView已减速,您可以控制减速速度。

VC应该是UIScrollViewDelegate并使其成为“无限滚动视图”。即当它滚动到一端时,代表将其放回另一端。

现在,您可以在旋转角度的x方向上应用contentOffset量。

0%偏移= 0转 100%偏移= 360度旋转

现在你并没有尝试为旋转设置动画,你只需要获取scrollView的偏移并将其作为旋转应用于针。

TBH,你甚至不需要它是隐形的,只是不加任何东西并将scrollView放在针上。

[--------SCROLL VIEW---------]  //scroll this
[--------NEEDLE VIEW---------]  //Use the scroll amount from the scroll view to apply rotation here.
[-COLORS and BODY PARTS VIEW-]  //Doesn't move
[-----VC  View---------------]  //Doesn't move

Apple已针对多个UI使用了类似的技术。

修改

我自己创建了这个以测试我的方法是否可行。

你可以看到UIViewController的完整代码来运行它......

Loop UIScrollView but continue decelerating

UIImageView是方形视图,箭头指向上方。 UIScrollViewUIImageView具有完全相同的框架,并且位于其顶部。

答案 1 :(得分:1)

使箭头图像视图移动并同时转动我将箭头图像视图嵌入到视图中并使用CGAffineTransformMakeRotation,就像您正在做的那样。然后移动嵌入箭头的视图并同时旋转箭头的图像视图。

然后在人滑动时让它旋转或移动得更快我会用velocityInView查看UIPanGestureRecognizer:看看他们移动手指的速度有多快并相应地调整动画。

 _panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanFrom:)];
[self.someView addGestureRecognizer:_panGestureRecognizer];

-(void)handlePanFrom:(UIPanGestureRecognizer *)recognizer{
CGPoint translation = [recognizer translationInView:recognizer.view];
CGPoint velocity    = [recognizer velocityInView:recognizer.view];



if (recognizer.state == UIGestureRecognizerStateBegan) {
}
else if (recognizer.state == UIGestureRecognizerStateChanged) {
    CGPoint tempPoint;
    tempPoint = [recognizer locationInView:self.view];
    NSLog(@"point %f", tempPoint.y);
    NSLog(@"center %f", self.someview.center.y);

}
else if (recognizer.state == UIGestureRecognizerStateEnded) {
    CGPoint tempPoint;
    tempPoint = [recognizer locationInView:self.view];


}

}