【问题标题】:CABasicAnimation ProblemCABasic动画问题
【发布时间】:2010-10-19 12:48:13
【问题描述】:

所以,我在文档中读到了使用

之类的块
beginAnimation
commitAnimation

不鼓励使用 os4.0。

所以我尝试使用 CABasicAnimation 让我的代码正常工作。我想实现,将图像的框架从其缩略图大小(在我的视图中某处)调整为全宽位置,例如(0, 120, 320, 240) - 在我的 iPhone 上。

到目前为止我所拥有的:

[CATransaction begin];
[CATransaction setValue:[NSNumber numberWithFloat:1.0] forKey:kCATransactionAnimationDuration]; 

CABasicAnimation *scalingAnimation;
scalingAnimation = [CABasicAnimation animationWithKeyPath:@"transform"];
scalingAnimation.duration=1.0/2;
scalingAnimation.autoreverses=YES;
scalingAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
scalingAnimation.fromValue=[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.0, 1.0, 1.0)];
scalingAnimation.toValue=[NSValue valueWithCATransform3D:CATransform3DMakeScale(4, 4, 1)];

[b.layer addAnimation:scalingAnimation forKey:@"scaling"];

[CATransaction commit];

我的下一步是首先尝试将图像移动到中心位置,然后将其缩放到正确的大小。但是,我怀疑我的做法是否正确。任何人都可以评论我的代码/方法....有更好的方法吗?

【问题讨论】:

    标签: iphone uiimage scale cabasicanimation


    【解决方案1】:

    我很确定你现在已经解决了这个问题,但无论如何。

    您不应该需要 [CATransaction begin];和 [CATransaction 提交]; 我发现做这种事情的最简单方法是使用 CAAnimationGroup 并逐个添加动画。

    一个例子是

    CABasicAnimation *scaleX = [CABasicAnimation animationWithKeyPath:@"transform.scale.x"];
    //this is not used, as the group provides the duration
    scaleX.duration = duration;
    scaleX.autoreverses = NO;
    
    scaleX.toValue = [NSNumber numberWithFloat:1.0];
    scaleX.fromValue = [NSNumber numberWithFloat:scaleFrom]; 
    scaleX.fillMode = kCAFillModeForwards;
    scaleX.removedOnCompletion = NO;
    
    CABasicAnimation *scaleY = [CABasicAnimation animationWithKeyPath:@"transform.scale.y"];
    //this is not used, as the group provides the duration
    scaleY.duration = duration;
    scaleY.autoreverses = NO;
    
    scaleY.toValue = [NSNumber numberWithFloat:1.0];
    scaleY.fromValue = [NSNumber numberWithFloat:scaleFrom]; 
    scaleY.fillMode = kCAFillModeForwards;
    scaleY.removedOnCompletion = NO;
    
    //add in the translation animations
    
    NSMutableArray* animationsArray = [NSMutableArray arrayWithObjects:scaleX,
                                                                       scaleY, 
    //and any other animations you want in the group
                                           nil];
    
    CAAnimationGroup *animationGroup = [CAAnimationGroup animation];
    animationGroup.duration = 1.0/2;
    animationGroup.timingFunction = [CAMediaTimingFunctionfunctionWithName:kCAMediaTimingFunctionEaseIn];
    animationGroup.animations = animationsArray;
    animationGroup.delegate = self;
    animationGroup.removedOnCompletion = YES;
    animationGroup.fillMode = kCAFillModeForwards;
    [animationGroup setValue:@"imageTransform" forKey:@"AnimationName"];
    [b.layer addAnimation:animationGroup forKey:@"imageTransform"];
    

    虽然有一些问题。动画是纯视觉的,因此在运行动画之前,请设置最终的视图框架。

    您会注意到比例以 1 结束,这是为了确保您不会以缩放的图像层结束。相反,我们开始缩放并使其恢复正常。

    翻译应该以同样的方式完成。

    希望对你有帮助

    【讨论】:

    • 感谢理查德。请注意,如果您复制并通过此代码,请确保更改此行:CABasicAnimation *scaleY = [CABasicAnimation animationWithKeyPath:@"transform.scale.x"];说“transform.scale.y”
    • @Doctor:为他解决了这个问题。 ;)
    【解决方案2】:
    //in Event Method Copy Below code to place the image to the center
    
        CABasicAnimation* positionAnimation;
        positionAnimation = [CABasicAnimation animationWithKeyPath:@"position"];
        positionAnimation.fromValue = [NSValue valueWithCGPoint:imageView.layer.position];
        positionAnimation.toValue = [NSValue valueWithCGPoint:centerPointofView];
        positionAnimation.duration = 2.0;
        positionAnimation.fillMode = kCAFillModeForwards;
        positionAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
        positionAnimation.removedOnCompletion = NO;
        positionAnimation.delegate = self;
        [imageView.layer addAnimation:positionAnimation forKey:@"positionAnimation"];
    
    // For Scale After image is in center copy below code
    
        - (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag{
        CAAnimation *animation = [imageView.layer animationForKey:@"positionAnimation"];
        if (animation == theAnimation) 
        {
            CABasicAnimation* scaleAnimation;
            scaleAnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
            scaleAnimation.fromValue = [NSNumber numberWithFloat:1];
            scaleAnimation.toValue = [NSNumber numberWithFloat:4.0];
            scaleAnimation.duration = 2.2;
            scaleAnimation.fillMode = kCAFillModeForwards;
           scaleAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
            scaleAnimation.removedOnCompletion = NO;
            scaleAnimation.delegate = self;
            [imageView.layer addAnimation:scaleAnimation forKey:@"scaleAnimation"];
        }
        else 
        {
            //if you want changes to image should remain forever 
            //place your code for scale & transform here
            ....................
            //now simple remove animation from layer
            [imageView.layer removeAllAnimations];
        }
    }
    

    【讨论】:

      【解决方案3】:

      你不能用

      [UIView animateWithDuration:2.0
                              animations:^{ 
                                  //animations
                              } 
                              completion:^(BOOL finished){
                                 // completion methods
                              }];
      

      【讨论】:

        猜你喜欢
        • 2013-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多