Как использовать UIBezierPath с CoreAnimation? - PullRequest
2 голосов
/ 03 февраля 2012

Я использую этот код для удаления анимации моего 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 ]

3 голосов
/ 04 февраля 2012

Анимации применяются к слою представления, а не к слою модели. Вы должны применить свои изменения к обоим. Это причудливый способ сказать, что когда вы что-то оживляете, вам также нужно установить это напрямую.

        ...
        [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. Слоя).

Глава 7 из Программирование на iOS 5 «Раздвигая пределы» содержит страницы и страницы, если вам нужны все подробности. Вот раздел на removedOnCompletion:

Иногда вы видите, что люди рекомендуют установить для параметра selectedOnCompletion значение NO, а для параметра fillMode - значение kCAFillModeBoth. Это не хорошее решение. По сути, анимация продолжается вечно, что означает, что слой модели никогда не обновляется. Если вы спросите значение свойства, вы продолжите видеть значение модели, а не то, что видите на экране. Если после этого вы попытаетесь неявно анимировать свойство, оно не будет работать правильно, поскольку CAAnimation все еще работает. Если вы когда-либо удаляете анимацию, заменяя ее другой с тем же именем, вызывая removeAnimationForKey: или removeAllAnimations, старое значение возвращается назад. Вдобавок ко всему, это тратит впустую память.

0 голосов
/ 04 февраля 2012

Попробуйте изменить анимацию непрозрачности на:

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

, а затем установите removeOnCompletion группы анимации на NO, а fillMode на kCAFillModeForwards, как предложил Ноа Уизерспун.

0 голосов
/ 03 февраля 2012

Установите для каждой анимации removedOnCompletion на NO и fillMode на kCAFillModeForwards.

...