0

我有一种方法可以翻译视图并在翻译时选择缩放它。我正在使用动画组并根据需要添加所需的动画。这是完美运行的动画案例。

  1. 平移(x 或 y 轴或两者)(OK)
  2. 缩放(确定)
  3. 缩放翻译(大部分)

但是,在缩放时进行平移仅在起始比例因子为 1 时才有效。当视图已经缩放时,我注意到大部分过渡跳跃而不是动画,尽管缩放和平移的最终结果是正确的。

我发布了部分代码以进行澄清。仅当previousZoomScale不是 1 时才会出现问题!我很感激你能给我指出的任何方向。


-(void)performAnimationForView: (AnimationType)animationType
                        WithDX: (CGFloat)dx
                         AndDY: (CGFloat)dy
                         Scale: (CGFloat)scale
                      Duration: (CGFloat)duration
{
    CABasicAnimation *translateXAnimation = nil,     *translateYAnimation = nil, *scaleAnimation = nil;
    NSString* animationGroupName;

    CGPoint newDxDy;

    switch (animationType)
    {

        case kAnimationTranslateAndScale:
            // set animation key
            animationGroupName = @"translatescale";

            translateXAnimation = [CABasicAnimation animationWithKeyPath:@"transform.translation.x"];
            translateXAnimation.repeatCount = 0;
            translateXAnimation.autoreverses = NO;
            translateXAnimation.removedOnCompletion = NO;
            translateXAnimation.fillMode = kCAFillModeForwards;
            translateXAnimation.fromValue = [NSNumber numberWithFloat: self.previousDxDy.x]; // previous point we're tranlsating from
            translateXAnimation.toValue = [NSNumber numberWithFloat:dx]; // destination point

            translateYAnimation = [CABasicAnimation animationWithKeyPath:@"transform.translation.y"];
            translateYAnimation.repeatCount = 0;
            translateYAnimation.autoreverses = NO;
            translateYAnimation.removedOnCompletion = NO;
            translateYAnimation.fillMode = kCAFillModeForwards;
            translateYAnimation.fromValue = [NSNumber numberWithFloat: self.previousDxDy.y]; 
            translateYAnimation.toValue = [NSNumber numberWithFloat:dy]; 

            newDxDy = CGPointMake(dx, dy);
            self.previousDxDy = newDxDy;

// scaling animation
            scaleAnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
            scaleAnimation.autoreverses = NO;
            scaleAnimation.repeatCount = 0;
            scaleAnimation.removedOnCompletion = NO;
            scaleAnimation.fillMode = kCAFillModeForwards;
            scaleAnimation.fromValue = [NSNumber numberWithDouble: self.previousZoomScale]; // initial zoom scale
            scaleAnimation.toValue = [NSNumber numberWithDouble:scale]; // target scale

            self.previousZoomScale = scale;

        break;
    }

    NSMutableArray* animationArray = [[NSMutableArray alloc] initWithObjects: nil];

    if (translateXAnimation != nil)
        [animationArray addObject: translateXAnimation];

    if (translateYAnimation != nil)
        [animationArray addObject: translateYAnimation];

    if (scaleAnimation != nil)
        [animationArray addObject: scaleAnimation];

    CAAnimationGroup *theGroup = [CAAnimationGroup animation];

    theGroup.duration = duration;
    theGroup.removedOnCompletion = NO;
    theGroup.fillMode = kCAFillModeForwards;
    theGroup.repeatCount = 0;
    theGroup.timingFunction = [CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionLinear];
    theGroup.animations = animationArray;
    theGroup.delegate = self;

    [theGroup setValue: animationGroupName forKey: @"animationtype"];

    [self.backgroundImageView.layer addAnimation: theGroup forKey: animationGroupName];
}
4

0 回答 0