CaAnimations не работает правильно

Я делаю приложение для Mac. У меня есть 5 карт подряд, и по нажатию кнопки все карты должны перевернуться последовательно (после переворота первой карты должен произойти переворот второй). Проблема, с которой я сталкиваюсь, заключается в следующем

Когда я нажимаю кнопку анимации, и карты должны переворачиваться сзади на передний план (цвет к числу), все отлично работает. Они прекрасно анимируются один за другим с поворотом вокруг оси Y.

Но когда я нажимаю кнопку анимации, и карты должны двигаться наоборот (число в цвет), вот что происходит: все карты заменяют свой начальный слой на задний слой без какой-либо анимации и все сразу.

После этого каждая карта одна за другой (последовательно) превращается в правильный передний слой и анимируется в задний слой.

Вот видео анимации

https://www.youtube.com/watch?v=fznUFR6pHCQ&feature=youtu.be

Что я могу изменить, чтобы получить анимацию нормально?

Я инициализировал карты, как это

flip1= [[PKRGSPFlipAnimationController alloc] initWithParent:firstCardView newFrontImage:[NSImage imageNamed:@"front.png"]];
    flip2= [[PKRGSPFlipAnimationController alloc] initWithParent:secondCardView newFrontImage:[NSImage imageNamed:@"front.png"]];
    flip3= [[PKRGSPFlipAnimationController alloc] initWithParent:thirdCardView newFrontImage:[NSImage imageNamed:@"front.png"]];
    flip4= [[PKRGSPFlipAnimationController alloc] initWithParent:fourthCardView newFrontImage:[NSImage imageNamed:@"front.png"]];
    flip5= [[PKRGSPFlipAnimationController alloc] initWithParent:fifthCardView newFrontImage:[NSImage imageNamed:@"front.png"]];

По нажатию кнопки я вызываю эту функцию

[flip1 flip:1];
[flip2 flip:2];
[flip3 flip:3];
[flip4 flip:4];
[flip5 flip:5];

Вот класс сальто (flip1-5): .m файл

define FLIP_TIME 1.0 // Time taken to do the animation.
#define PERSPECTIVE 1000
#define RECT NSMakeRect(0, 0, 134, 198) // Value of the coordiantes of the parent view.
#define DEGREES_TO_RADIANS(angle) (angle * M_PI / 180.0)
#import "PKRGSPFlipAnimationController.h"

@implementation PKRGSPFlipAnimationController

@synthesize cardLayer;
@synthesize frontLayer;
@synthesize backLayer;

@synthesize parentView;

@synthesize isFront;

-(id)initWithParent:(NSView *)newParent newFrontImage:(NSImage *)newFront{
    self = [super init];
    if (self) {
        parentView = newParent;
        isFront = false;

        cardLayer =[CATransformLayer layer];
        [cardLayer setFrame:RECT];

        frontLayer = [CALayer layer];
        [frontLayer setFrame:RECT];
        [frontLayer setZPosition:1.0];
        [frontLayer setDoubleSided:NO];
        [frontLayer setContents:(id)newFront];
        [cardLayer addSublayer:frontLayer];

        backLayer = [CALayer layer];
        [backLayer setFrame:RECT];
        [backLayer setZPosition:2.0];
        [backLayer setDoubleSided:NO];
        [backLayer setContents:(id)[NSImage imageNamed:@"back.png"]];

        [cardLayer addSublayer:backLayer];

        [parentView setLayer:[CALayer layer]];
        [parentView setWantsLayer:YES];
        [parentView.layer addSublayer:cardLayer];

    }
    return self;
}

- (CAAnimation*) createAnimFrom:(double)frAngl to:(double)toAngl
{
    //For the card to rotate on the
    //  Y axis - @"transform.rotation.y"
    //  X axis - @"transform.rotation.x"

    NSString* rotationAxis = @"transform.rotation.y";

    CABasicAnimation* ba = [CABasicAnimation animationWithKeyPath:rotationAxis];
    ba.fromValue = [NSNumber numberWithFloat:frAngl];
    ba.toValue = [NSNumber numberWithFloat:toAngl];

    CABasicAnimation *shrinkAnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
    shrinkAnimation.toValue = [NSNumber numberWithFloat:0.7f];
    shrinkAnimation.duration =  FLIP_TIME*0.5;
    shrinkAnimation.autoreverses = YES;

    CAAnimationGroup *animationGroup = [CAAnimationGroup animation];
    animationGroup.animations = [NSArray arrayWithObjects:ba, shrinkAnimation, nil];
    animationGroup.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
    animationGroup.duration = FLIP_TIME;
    animationGroup.fillMode = kCAFillModeForwards;
    animationGroup.removedOnCompletion = NO;
    return animationGroup;
}

-(void) flip: (int) beginTime
{
    CALayer * currLayer;
    CALayer * nextLayer;
    if(isFront){
        currLayer=frontLayer;
        nextLayer=backLayer;
    }
    else{
        currLayer=backLayer;
        nextLayer=frontLayer;
    }
    NSLog(@"%hhd", isFront);
    isFront=!isFront;

    [CATransaction begin];
    CAAnimation* anim1 = [self createAnimFrom:0.0 to:M_PI];
    anim1.duration  = FLIP_TIME;
    anim1.beginTime = CACurrentMediaTime()+beginTime;
    CAAnimation* anim2 = [self createAnimFrom:-M_PI to:0.0];
    anim2.duration  = FLIP_TIME;
    anim2.beginTime = CACurrentMediaTime()+beginTime;
    [CATransaction commit];


    //add perspective
    CATransform3D mt = CATransform3DIdentity;
    mt.m34 = 1.0/(double)PERSPECTIVE;

    currLayer.transform = mt;
    nextLayer.transform = mt;

    NSPoint ap = {0.5,0.5};
    currLayer.anchorPoint = ap;
    nextLayer.anchorPoint = ap;

    [CATransaction begin];
    [currLayer addAnimation:anim1 forKey:@"flip"];
    [nextLayer addAnimation:anim2 forKey:@"flip"];
    [CATransaction commit];
}
@end

.h файл

#import <Cocoa/Cocoa.h>
#import <QuartzCore/QuartzCore.h>

@interface PKRGSPFlipAnimationController : NSObject

-(id)initWithParent:(NSView *)newParent newFrontImage:(NSImage *)newFront;
- (void) flip: (int) beginTime;

@property (nonatomic, strong) NSView* parentView;

@property (nonatomic, strong) CATransformLayer * cardLayer;
@property (nonatomic, strong) CALayer *frontLayer; // Front side (Number side) of the card.
@property (nonatomic, strong) CALayer *backLayer; // Back side (Blank side) of the card.

@property (nonatomic) BOOL isFront; // Boolean value for the card to check if it is turned.
@end

1 ответ

Решение

Я добавил остановку анимации и инициализировал ее снова. Это решило проблему

Другие вопросы по тегам