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 延迟解决了问题。
非常感谢。
我正在编写一个小纸牌游戏,其中有 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 延迟解决了问题。 非常感谢。