的iOS - 旋转的层右和使用两个不同的UIButtons左(iOS - Rotate a lay

2019-10-29 04:38发布

我创建使用的CALayer层,并使用CABasicanimation与旋转的动画动画,并创造了二触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"];

}

任何帮助吗?

提前致谢

Answer 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];
}


文章来源: iOS - Rotate a layer right and left using two different UIButtons