代码之家  ›  专栏  ›  技术社区  ›  P i

核心动画:为什么我不能合成两个动画?

  •  1
  • P i  · 技术社区  · 15 年前

    我正试图制作一个轮子的动画

    当手指停留>0.1秒时,车轮“弹出”,即I动画比例从1.0到1.2。

    当手指移动时,轮子随之转动(只有当它被弹出时)。

    但我遇到了一个问题:一旦它开始旋转,刻度就减小到1.0。

    - (void) spin: (Direction) direction
    {
     float thetaOld = thetaWheel;
    
     float k = (direction == AntiClockwise) ? -1 : 1;
     float t = 2 * M_PI * ( k / 12.0 );
     thetaWheel += t;
    
     CABasicAnimation * anim = [CABasicAnimation animationWithKeyPath:@"transform"];
    
     anim.fromValue = [NSNumber numberWithDouble: thetaOld];
     anim.toValue = [NSNumber numberWithDouble: thetaWheel];
    
     anim.valueFunction = [CAValueFunction functionWithName: kCAValueFunctionRotateZ];
    
     anim.timingFunction = [CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionEaseInEaseOut]; 
    
     anim.duration = 0.1f;
     anim.fillMode = kCAFillModeForwards;
     anim.removedOnCompletion = NO;
    
     [self.wheelLayer addAnimation: anim forKey:@"transform"];
    }
    
    - (void) popOut
    {
     CABasicAnimation * anim = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
    
     anim.fromValue = [NSNumber numberWithDouble: 1.0];
     anim.toValue = [NSNumber numberWithDouble: 1.2];
    
     anim.timingFunction = [CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionEaseInEaseOut]; 
    
     anim.duration = 0.25f;
     anim.fillMode = kCAFillModeForwards;
     anim.removedOnCompletion = NO;
    
     [self.wheelLayer addAnimation: anim forKey:@"transform.scale"];
    }
    
    // doesnt get used yet
    - (void) popBack
    {
     CABasicAnimation * anim = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
    
     anim.fromValue = [NSNumber numberWithDouble: 1.2];
     anim.toValue = [NSNumber numberWithDouble: 1.0];
    
     anim.timingFunction = [CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionEaseInEaseOut]; 
    
     anim.duration = 0.1f;
     anim.fillMode = kCAFillModeForwards;
     anim.removedOnCompletion = NO;
    
     [self.wheelLayer addAnimation: anim forKey:@"transform.scale"];
    }
    

    最后一个程序此时无法使用!所以我看不出是什么把比例缩小到1…

    看起来第二个动画覆盖了第一个…

    如何正确执行此操作?

    1 回复  |  直到 15 年前
        1
  •  2
  •   Vladimir    15 年前

    我猜(还没有测试过)在动画中应用于“转换”关键路径的层转换会覆盖在缩放动画中应用的转换。

    对于旋转,尝试使用动画 transform.rotation.z 而不是keypath(在这种情况下,您不需要设置valuefunction)