我使用CALayer创建了一个图层,并使用带有旋转动画的CABasicanimation动画并创建了两个TouchDown UIButtons来左右旋转,当图层向右旋转时我遇到问题它返回原始角度并且左边相同旋转
这是我的代码:
-(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"];
}
请帮忙吗?
先谢谢
答案 0 :(得分:1)
它返回到原始角度,因为holdRelease方法删除了动画,还原了图层的位置。
使用CADisplay链接可以轻松手动旋转图层。
@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];
}