我正在写一个小牌纸牌游戏,其中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];
}
答案 0 :(得分:1)
我的猜测是[self performSelector:@selector(flipSingleCard) withObject:nil afterDelay:0.0];
是罪魁祸首。似乎这可能是一个时间问题。您是否尝试过为此添加实际延迟?说... 0.1
?我相信这样做可以解决这个问题,或者只是直接调用方法而不是使用performSelector
。
答案 1 :(得分:1)
看起来确实是BHendricks怀疑的时间问题。 添加0.1延迟解决了这个问题。 非常感谢。