CGAffineTransformMakeRotation 逆时针旋转

8
我试图通过用户在UIImageView上按下手指并顺时针移动手指来使其旋转,以逆时针方向进行动画处理。
基本上,一旦触摸结束,我希望UIImageView返回到其原始位置,并且应该向逆时针方向移动。

我的问题是每次角度(以度为单位)大于180时,图像就会顺时针旋转回到其原始位置。 显然它正在采取最短的路径返回。 对于小于179度的角度,图像逆时针旋转(我需要的方向)。

我尝试了这两个代码片段,它们的行为方式相同。 有什么建议吗?

注意:这里的angle变量是double类型,初始化为零,并且在我的代码中始终保持为0。

-(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{
    [self handleObject:touches withEvent:event isLast:YES];

    /* this doesn't make rotation counter clockwise for rotations greater than 180 */
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationCurve: UIViewAnimationCurveLinear];
    [UIView setAnimationDuration:1.0];
    [UIView setAnimationRepeatCount:1]; 
    CGAffineTransform transform = CGAffineTransformMakeRotation(angle);
    circle1ImgVw.transform = CGAffineTransformRotate(transform, angle);
    // ends animation
    [UIView commitAnimations];


    /* this doesn't make rotation counter clockwise for rotations greater than 180 */
    [UIView animateWithDuration:1.0 animations:^{
            circle1ImgVw.transform = CGAffineTransformMakeRotation(angle);
        }];
} 

我尝试研究了这篇文章,但它存在几个问题:

  • 动画完成后,我无法再触摸和旋转图像。
  • 它总是顺时针旋转,并且我一直没有找到如何使其从用户结束旋转图像的地方平滑地逆时针旋转的方法。

ACB - 我查看了那篇帖子,它不是重复的。我无法让它逆时针移动! - Sam B
2个回答

3

我遇到了类似的问题,看一下被接受的答案,或许对你有帮助:

如何使UIView顺时针旋转大于180度的角度


回应评论,这或许可以帮到你:

在我的代码中实际使用了

rotationAnimation.fromValue
rotationAnimation.toValue

替代

rotationAnimation.byValue.

如果toValue小于fromValue,旋转方向始终是逆时针。无论您的值是正数还是负数,只有它们之间的关系才重要。

确定起始角度,确定旋转方向,确定结束角度。如果要逆时针旋转,请确保结束角度小于起始角度。这是我用于将钟表指针顺时针从12:00旋转到当前时间的代码。

-(void) viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    [self updateClockArmAngle];
}

- (void)updateClockArmAngle
{
    // Get the time
    NSDate *date = [NSDate date];
    NSCalendar* calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
    [calendar setTimeZone:[NSTimeZone timeZoneWithName:@"America/Toronto"]];
    NSDateComponents* components = [calendar components:(NSHourCalendarUnit | NSMinuteCalendarUnit) fromDate:date];

    CGFloat hour = [components hour];
    CGFloat angle = (hour/24.0)*(2*M_PI);

    CGFloat minute = [components minute];
    angle += (minute/(24*60))*(2*M_PI);

    [self rotateViewAnimated:self.clockArm withDuration:1.5 byAngle:angle];
}


- (void) rotateViewAnimated:(UIView*)view
               withDuration:(CFTimeInterval)duration
                    byAngle:(CGFloat)angle
{    
    CABasicAnimation *rotationAnimation;
    rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
    rotationAnimation.fromValue = 0;
    rotationAnimation.toValue = [NSNumber numberWithFloat:angle];
    rotationAnimation.duration = duration;
    rotationAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
    [rotationAnimation setRemovedOnCompletion:NO];
    [rotationAnimation setFillMode:kCAFillModeForwards];
    [view.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"];
}

顺便说一下,如果我在那个 void 函数中添加 "angle = angle * -1;",它会逆时针旋转,但对于大于 180 度的角度,它会重新回到顺时针旋转。 - Sam B
请查看我的评论 - Sam B
看起来很酷。我相当确定使用答案中提供的方法,如果给定的角度为负,则旋转将始终逆时针。我用<-360的角度进行了测试,仍然得到逆时针旋转。我认为您只需要弄清楚要旋转的方向,然后确保给出的角度是适当的。我猜当您看到顺时针旋转时,原始角度为负,因此将其乘以-1使其变为正数。 - Darren
谢谢你提供的代码,伙计。但是,它对我不起作用,我的起始角度总是0。如果我插入[self rotateViewAnimated:self.clockArm withDuration:1.5 byAngle:0.000]; 它什么也不做。我所尝试的就是一旦图像被旋转,让它通过逆时针方向回到原来的位置。虽然感谢你的努力。 - Sam B
@SamBudda -- 你可能需要做的一件事是在屏幕设计的最外层UIView中关闭“自动调整子视图”功能。这会对旋转图像造成各种问题。 - Hot Licks
显示剩余6条评论

0
我使用的技巧是将旋转角度除以2,并将旋转分为两个单独的动画,通过animateWithDuration:delay:options:animations:completion:completion:参数链接。但是,由于视图已经旋转到其当前位置,您需要从该位置开始并“反向旋转”回零,而不是尝试从零逆时针旋转。

它看起来非常平滑(事实上,我感到惊讶)。确保第二次旋转没有任何延迟,并且您的变换是预先计算的。 - Hot Licks
我正在按照你说的做,但如果它对你起作用,那么我一定做错了什么。知道这个可以行得通很好。 - Darren
1
@Darren - 你可能不想在第一个动画的completion:子句中放置整个第二个动画。相反,让它调用一个方法来完成后半部分。 - Hot Licks
@Darren - 块存在一些可怕的数据链接问题。我无法指出具体原因,但在编写代码时似乎不明智。 - Hot Licks
Darren - 看看我的完整代码。这是我用来获得平滑逆时针旋转的小计时器技巧。当然,您也可以使用相同的代码来进行顺时针旋转。 - Sam B
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接