Rotate a layer right and left using two different UIButtons

I created a layer using CALayer and animated it using CABasicanimation with rotate animation and created two TouchDown UIButtons to rotate it left and right, I got a problem when the layer rotates right it gets back to the original angle and the same with left rotation

Here's my code:

-(void)viewDidLoad
{
    //Button 1
    UIButton *aButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    aButton.frame = CGRectMake(0, 0, 145, 145);
    aButton.center = CGPointMake(90, 190);
    aButton.backgroundColor = [UIColor redColor];
    [aButton addTarget:self action:@selector(holdDown) forControlEvents:UIControlEventTouchDown];
    [aButton addTarget:self action:@selector(holdRelease) forControlEvents:UIControlEventTouchUpOutside];
    [aButton addTarget:self action:@selector(holdRelease) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:aButton];

    //Button 2
    UIButton *bButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    bButton.frame = CGRectMake(0, 0, 145, 145);
    bButton.center = CGPointMake(690, 190);
    bButton.backgroundColor = [UIColor redColor];
    [bButton addTarget:self action:@selector(holddDown) forControlEvents:UIControlEventTouchDown];
    [bButton addTarget:self action:@selector(holdReleasee) forControlEvents:UIControlEventTouchUpOutside];
    [bButton addTarget:self action:@selector(holdReleasee) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:bButton];
}

-(void)holddDown{
    animaEQ = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
    animaEQ.toValue = [NSNumber numberWithFloat:5];
    animaEQ.removedOnCompletion = NO;
    animaEQ.repeatCount= HUGE_VAL;
    animaEQ.duration = 2.2f;
    [equaMi addAnimation:animaEQ forKey:@"blls"];
}
-(void)holdReleasee{
    [equaMi removeAnimationForKey:@"blls"];
}




- (void)holdDown
{
    animaEQl = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
    animaEQl.toValue = [NSNumber numberWithFloat:-5];
    animaEQl.removedOnCompletion = NO;
    animaEQl.repeatCount= HUGE_VAL;
    animaEQl.duration = 2.2f;
    [equaMi addAnimation:animaEQl forKey:@"bls"];
}

- (void)holdRelease
{
    [equaMi removeAnimationForKey:@"bls"];

}

Any help please?

Thanks in Advance


It's returning to its original angle because the holdRelease method removes the animation, reverting the layer's position.

Using a CADisplay link makes it easy to rotate the layer manually.

@implementation ViewController {
    CADisplayLink *timer;
}

-(void)viewDidLoad
{
    //Button 1
    UIButton *aButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    aButton.frame = CGRectMake(0, 0, 145, 145);
    aButton.center = CGPointMake(90, 190);
    aButton.backgroundColor = [UIColor redColor];
    aButton.tag = 0;
    [aButton addTarget:self action:@selector(holdDown:) forControlEvents:UIControlEventTouchDown];
    [aButton addTarget:self action:@selector(holdRelease:) forControlEvents:UIControlEventTouchUpOutside];
    [aButton addTarget:self action:@selector(holdRelease:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:aButton];

    //Button 2
    UIButton *bButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    bButton.frame = CGRectMake(0, 0, 145, 145);
    bButton.center = CGPointMake(690, 190);
    bButton.backgroundColor = [UIColor redColor];
    bButton.tag = 1;
    [bButton addTarget:self action:@selector(holdDown:) forControlEvents:UIControlEventTouchDown];
    [bButton addTarget:self action:@selector(holdRelease:) forControlEvents:UIControlEventTouchUpOutside];
    [bButton addTarget:self action:@selector(holdRelease:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:bButton];
}

- (void)holdDown:(UIButton*)sender
{
    //check which button was pressed
    rotateLeft = (sender.tag == 0);
    //start the timer
    if (!timer) {
        timer = [CADisplayLink displayLinkWithTarget:self selector:@selector(rotate)];
        timer.frameInterval = 1.0f;
        [timer addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
    }
}

- (void)holdRelease:(UIButton*)sender
{
    //end the timer
    [timer invalidate];
    timer = Nil;
}

-(void)rotate
{
    //create the rotation transform based on current rotation and button pressed
    static int i;
    if (rotateLeft) {
        i++;
    } else {
        i--;
    }
    float rotation = (M_PI/60)*i;

    //disable implicit animations
    [CATransaction begin];
    [CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions];

    //rotate the layer
    CGAffineTransform transform = CGAffineTransformMakeRotation(rotation);
    equaMi.affineTransform = transform;

    [CATransaction commit];
}
链接地址: http://www.djcxy.com/p/12880.html

上一篇: 使用CABasicAnimation围绕其中心旋转CAShapeLayer弧

下一篇: 左右旋转一层使用两个不同的UIButtons