【问题标题】:iOS - Rotate a layer right and left using two different UIButtonsiOS - 使用两个不同的 UIButton 左右旋转图层
【发布时间】:2014-01-16 19:12:57
【问题描述】:

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

}

有什么帮助吗?

提前致谢

【问题讨论】:

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


    【解决方案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];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多