UIView setAnimationTransition有时只工作但不总是?

时间:2016-10-12 10:17:40

标签: ios uiviewanimationtransition

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

每张卡片正面和卡片背面都存储在图像视图中。 UIButton捕获用户点击,应该翻转卡片。

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

请参阅下面的代码,为了简化起见,我已经删除了以下方法中4种不同卡的处理方式。可读性。此外,我已经用这里的正面和背面的静态图像名称替换了一些数组/文件名 - 杂耍卡。

这段代码的奇怪之处在于它有时会连续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];
}

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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