Ios 动画隐藏了一半的视野

Ios 动画隐藏了一半的视野,ios,objective-c,macos,calayer,caanimation,Ios,Objective C,Macos,Calayer,Caanimation,我在做一个纸牌游戏,我需要把纸牌翻过来。先面朝下,然后翻转,这样脸就朝上了。我制作了一个很好的动画,效果很好,只是在动画过程中,有一半的视图隐藏在后面的图层后面,请参见屏幕截图 动画完成后,卡片视图将堆叠在其他视图的顶部 关于为什么在动画期间隐藏一半视图的任何提示 截图: 代码: 最后我在玩弄卡片的xIndex,所以现在它可以工作了 我对代码做了太多的修改,所以无法在这里发布。您设置了卡的zIndex吗?您是否考虑过添加卡宽一半的ztranslation?没有。我对动画仍然很不了解@David

我在做一个纸牌游戏,我需要把纸牌翻过来。先面朝下,然后翻转,这样脸就朝上了。我制作了一个很好的动画,效果很好,只是在动画过程中,有一半的视图隐藏在后面的图层后面,请参见屏幕截图

动画完成后,卡片视图将堆叠在其他视图的顶部

关于为什么在动画期间隐藏一半视图的任何提示

截图:

代码:


最后我在玩弄卡片的xIndex,所以现在它可以工作了


我对代码做了太多的修改,所以无法在这里发布。

您设置了卡的zIndex吗?您是否考虑过添加卡宽一半的ztranslation?没有。我对动画仍然很不了解@DavidRönnqvist如何设置卡的z索引?为什么只有一半的牌是隐藏的?什么是z翻译?
- (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"]];
        }
    }
}