2014-03-31 3 views
0

Я делаю карточную игру, где мне нужны карты, чтобы «перевернуть». Чтобы быть первым лицом вниз, а затем перевернуть, так что лицо вверх. Я сделал приятную анимацию, и она работает хорошо, за исключением того, что половина этого вида скрыта за слоем за анимацией (см. Снимок экрана).CAAnimation скрывает половину обзора

Когда анимация завершена, вид карты выглядит красиво поверх других видов.

Любые подсказки о том, почему половина просмотра скрыта во время анимации?

Скриншот: Screenshot 1

Код:

- (void)setFaceDirection:(BOOL)up{ 
    if(up && !self.faceUp){ 
     self.faceUp = up; 
     [self flip:@"in"]; 
    }else if(!up && self.faceUp){ 
     self.faceUp = up; 
     [self flip:@"out"]; 
    } 
} 

- (void)flip:(NSString *)direction{ 
    NSLog(@"flip"); 
    [NSTimer scheduledTimerWithTimeInterval:0.0 target:self selector:@selector(firstFlip) userInfo:nil repeats:NO]; 
    [NSTimer scheduledTimerWithTimeInterval:1.2 target:self selector:@selector(secondFlip) userInfo:nil repeats:NO]; 
} 

- (void)firstFlip{ 
    [CATransaction begin]; 
    CAAnimation* anim1 = [self createAnimDirection:@"in"]; 
    [CATransaction commit]; 

    //add perspective 
    CATransform3D mt = CATransform3DIdentity; 
    mt.m34 = 1.0/1000; 
    mt = CATransform3DTranslate(mt, 0.0f, 0.0f, 0.01f); 

    CALayer* lr = [self layer]; 
    lr.transform = mt; 

    NSPoint ap = {0.5,0.0}; // Begin from OS X Mountain Lion ancorPoint by default at 0,0; 
    lr.anchorPoint = ap; 

    // animation delegate to this class to handle message on its completion 
    anim1.delegate = self; 

    CGPoint center = CGPointMake(CGRectGetMidX(self.frame), self.frame.origin.y); 
    // lr.position = center; 

    [CATransaction begin]; 
    [lr addAnimation:anim1 forKey:@"flip"]; 
    [CATransaction commit]; 
} 

- (void)secondFlip{ 
    [CATransaction begin]; 
    CAAnimation* anim1 = [self createAnimDirection:@"out"]; 
    [CATransaction commit]; 

    //add perspective 
    CATransform3D mt = CATransform3DIdentity; 
    mt.m34 = 1.0/1000; 
    mt = CATransform3DTranslate(mt, 0.0f, 0.0f, 0.01f); 

    CALayer* lr = [self layer]; 
    lr.transform = mt; 

    NSPoint ap = {0.5,0}; // Begin from OS X Mountain Lion ancorPoint by default at 0,0; 
    lr.anchorPoint = ap; 

    // animation delegate to this class to handle message on its completion 
    anim1.delegate = self; 

    CGPoint center = CGPointMake(CGRectGetMidX(self.frame), self.frame.origin.y); 
    lr.position = center; 

    [CATransaction begin]; 
    [lr addAnimation:anim1 forKey:@"flip"]; 
    [CATransaction commit]; 
} 

- (CAAnimation*) createAnimDirection:(NSString *) direction 
{ 
    double from = 0.0; 
    double to = M_PI/2; 
    if ([direction isEqualToString:@"in"]){ 
     [self setImage:[NSImage imageNamed:@"Card_Background"]]; 
    }else{ 
     from = -M_PI/2; 
     to = 0.0; 
     [self setImage:self.faceImage]; 
    } 

    NSString* sRotation; 
    sRotation = @"transform.rotation.y"; 
    CABasicAnimation* ba = [CABasicAnimation animationWithKeyPath:sRotation]; 
    ba.fromValue = [NSNumber numberWithFloat:from]; 
    ba.toValue = [NSNumber numberWithFloat:to]; 

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

    return animationGroup; 
} 

- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag{ 
    if(flag){ 
     if (self.faceUp){ 
      [self setImage:self.faceImage]; 
     }else{ 
      [self setImage:[NSImage imageNamed:@"Card_Background"]]; 
     } 
    } 
} 
+0

Вы установили 'zIndex' из карт? –

+0

Вы посмотрели добавление 'z'трансляции половины ширины карты? – Wain

+0

Нет. Я до сих пор очень нелюбив, когда речь заходит о CAAnimations. @ DavidRönnqvist Как установить z-индекс карт? Почему только половина карты скрыта? Что такое z-перевод? –

ответ

0

Я в конечном итоге Мессинг вокруг с xIndex карт, так что теперь он работает.

Я изменил код настолько, что я не могу его разместить здесь.

Смежные вопросы