如何在CoreAnimation中使用UIBezierPath?

时间:2012-02-03 18:26:43

标签: iphone objective-c xcode core-animation

我正在使用此代码删除动画我的UIView到删除按钮按下时的删除按钮。 这是代码:

UIBezierPath *movePath = [UIBezierPath bezierPath];
            [movePath moveToPoint:icon.center];
            [movePath addQuadCurveToPoint:senderView.center
                             controlPoint:CGPointMake(senderView.center.x, icon.center.y)];

            CAKeyframeAnimation *moveAnim = [CAKeyframeAnimation animationWithKeyPath:@"position"];
            moveAnim.path = movePath.CGPath;
            moveAnim.removedOnCompletion = YES;

            CABasicAnimation *scaleAnim = [CABasicAnimation animationWithKeyPath:@"transform"];
            scaleAnim.fromValue = [NSValue valueWithCATransform3D:CATransform3DIdentity];
            scaleAnim.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(0.1, 0.1, 1.0)];
            scaleAnim.removedOnCompletion = YES;

            CABasicAnimation *opacityAnim = [CABasicAnimation animationWithKeyPath:@"alpha"];
            opacityAnim.fromValue = [NSNumber numberWithFloat:1.0];
            opacityAnim.toValue = [NSNumber numberWithFloat:0.1];
            opacityAnim.removedOnCompletion = YES;

            CAAnimationGroup *animGroup = [CAAnimationGroup animation];
            animGroup.animations = [NSArray arrayWithObjects:moveAnim, scaleAnim, opacityAnim, nil];
            animGroup.duration = 2.0;
            [icon.layer addAnimation:animGroup forKey:nil];

这实际上是将UIView设置为删除按钮,但在它再次出现在同一个地方之后。

3 个答案:

答案 0 :(得分:3)

动画适用于表示层,而不适用于模型层。您需要将更改应用于两者。这是一种奇特的说法,当你做动画时,你还需要直接设置它。

        ...
        [icon.layer setPosition:CGPointMake(senderView.center.x, icon.center.y)];
        [icon.layer setTransform:CATransform3DMakeScale(0.1, 0.1, 1.0)]];
        [icon.layer setAlpha:0.1];

(请注意,您可能希望在此处为视图的center设置动画,而不是图层的position。)

iOS 5 Programming Pushing the Limits的第7章有关于此的页面和页面,如果你想要所有的血腥细节。以下是removedOnCompletion的部分:

  

有时您会看到人们建议将removedOnCompletion设置为NO,将fillMode设置为kCAFillModeBoth。这不是一个好的解决方案。它实质上使动画永远继续,这意味着模型层永远不会更新。如果您询问该属性的值,您将继续看到模型值,而不是您在屏幕上看到的值。如果您之后尝试隐式地为该属性设置动画,则它将无法正常工作,因为CAAnimation仍在运行。如果您通过将其替换为具有相同名称的另一个动画来删除动画,则调用removeAnimationForKey:或removeAllAnimations,旧值会快速恢复。最重要的是,它浪费了记忆。

答案 1 :(得分:0)

将每个动画的removedOnCompletion设置为NO,将fillMode设置为kCAFillModeForwards

答案 2 :(得分:0)

尝试将不透明度动画更改为:

CABasicAnimation *opacityAnim = [CABasicAnimation animationWithKeyPath:@"opacity"];

然后将动画组的removeOnCompletion设置为NO,将fillMode设置为kCAFillModeForwards,如Noah Witherspoon所示。

相关问题