CALayer转型

时间:2012-02-01 11:19:40

标签: objective-c ios calayer

当用户执行UIRotationGesture时,我需要旋转一个正方形。

我的手势都已设置完毕。问题是每当用户移动他们的手指时,方块返回到起始位置,然后动画到新位置。而不是从前一个位置移动到新位置。

,即如果方形的旋转是90度并且用户继续旋转到100,则方形将回到0度并且动画为100。

基本上我希望广场在执行旋转手势时镜像用户。

- (void)respondToGesture:(UIRotationGestureRecognizer *)rec{

NSLog(@"Rotation: %f", rec.rotation);

[self rotateWithRadian:rec.rotation];

if (rec.state == UIGestureRecognizerStateEnded) {
    NSLog(@"gesture ended");
}

}



- (void)rotateWithRadian:(float)radian{

CABasicAnimation *spin = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];

spin.removedOnCompletion = NO;

spin.fillMode = kCAFillModeForwards;

[spin setByValue:[NSNumber numberWithFloat:radian]];

[spin setDuration:1.0];

[squarelayer addAnimation:spin forKey:@"spinAnimation"];

2 个答案:

答案 0 :(得分:2)

你有没有理由不直接设置图层的变换而不是使用动画?

这应该做你想要的:

- (void)respondToGesture:(UIRotationGestureRecognizer *)rec {
    if (rec.state == UIGestureRecognizerStateChanged) {
        CGAffineTransform currentTransform = squareLayer.affineTransform;
        squareLayer.affineTransform = CGAffineTransformRotate(currentTransform, gesture.rotation);
        gesture.rotation = 0;
    }
}

如果您希望围绕用户旋转的中心而不是图层的中心进行旋转,则还需要调整squareLayer.anchorPoint

答案 1 :(得分:1)

单指旋转有一个开源(https://github.com/kirbyt/KTOneFingerRotationGestureRecognizer)。你可以看一下,会好多了。即使您只想要正常旋转手势,也可以查看代码以获得更好的旋转代码。它使用中心作为起源。