UIView setAnimationTransition 只是有时有效但并非总是有效?

UIView setAnimationTransition only working sometimes but not always?

我正在编写一个小纸牌游戏,其中有 4 张纸牌被发到屏幕上,用户可以点击每张纸牌来显示(并再次隐藏)它。

每张卡片正面和背面都存储在图像视图中。一个 UIButton 捕捉到用户的点击并且应该翻转卡片。

我已将卡片的正面和背面作为子视图添加到容器视图中,并使用方法 UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight 制作动画。

请看下面的代码,为了简化和可读性,我在下面的方法中删除了对 4 种不同卡片的处理。此外,我在此处用正面和背面的静态图像名称替换了一些 array/filename-juggling 卡片。

现在这段代码的奇怪之处在于有时它会连续 10 次按预期工作(即显示翻转动画)但有时根本不显示动画(即显示另一面卡片但没有翻转。)。然后是相反的方式:有时卡片会在没有任何动画的情况下显示 7 或 8 次,然后突然显示翻转动画。 这让我抓狂,因为我看不出这种奇怪行为的原因。 你有什么主意吗?我正在建设 iOS 8 到 iOS 10.

来自 .h 文件:

@interface GameViewController : UIViewController 
{
    UIImageView             *cardback1;
    UIImageView             *cardfront1;
    UIView                  *containerView;
    BOOL                    c1Flipped;
    // much more...
}

并且来自 .m 文件:

-(void)flipCardButtonClicked:(id)sender
{
    containerView = [[UIView alloc] initWithFrame: CGRectMake(25,420,220,300)];
    [self.view addSubview:containerView];       

    c1Flipped = !c1Flipped;

    cardback1 = [[UIImageView alloc] initWithFrame: CGRectMake(0,0,220,300)];
    cardfront1 = [[UIImageView alloc] initWithFrame: CGRectMake(0,0,220,300)];

    if (c1Flipped)       
    {
        cardback1.image = [UIImage imageNamed:@"backside.png"];
        cardfront1.image = [UIImage imageNamed:@"frontside.png"];
    }
    else 
    {
        cardback1.image = [UIImage imageNamed:@"frontside.png"];
        cardfront1.image = [UIImage imageNamed:@"backside.png"];
    }

    [containerView addSubview:cardfront1];
    [containerView addSubview:cardback1];
    [cardfront1 release];
    [cardback1 release];

    [self performSelector:@selector(flipSingleCard) withObject:nil afterDelay:0.0];
}

-(void)flipSingleCard
{
    [containerView.layer removeAllAnimations]; 
    [UIView beginAnimations:@"cardFlipping" context:self];  
    [UIView setAnimationBeginsFromCurrentState:YES];   
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(flipDidStop:finished:context:)];
    [UIView setAnimationDuration:0.5];
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:containerView cache:YES];
    [containerView exchangeSubviewAtIndex:0 withSubviewAtIndex:1];
    [UIView commitAnimations];
}

-(void)flipDidStop:(NSString*)animationID finished:(BOOL)finished context:(void *)context 
{
    [containerView removeFromSuperview];
    [containerView release];
}

我的猜测是 [self performSelector:@selector(flipSingleCard) withObject:nil afterDelay:0.0]; 是罪魁祸首。似乎这可能是一个时间问题。您是否尝试过为此添加实际延迟?说...0.1?我相信这样做可以解决这个问题,或者只是直接调用该方法而不是使用 performSelector

看起来确实是 BHendricks 怀疑的时间问题。 添加 0.1 延迟解决了问题。 非常感谢。