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