iOS - 使用两个不同的UIButton左右旋转图层

时间:2014-01-16 19:12:57

标签: ios iphone objective-c core-graphics core-animation

我使用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"];

}

请帮忙吗?

先谢谢

1 个答案:

答案 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];
}