2009-09-21 45 views
5

我正在为正在制作的纸牌游戏添加一些基本动画。 (我的第一个iPhone应用程序)开始动画之前修改iPhone动画容器视图

我正在创建一个自定义的UIView类“AnimationContainer”,它从image1翻转到image2,同时从rect1移动到rect2。我的最终目的是让这些容器中的四个同时进行转换。

我遇到的问题是动画不显示image1 ...所以只有翻转过渡的后半部分出现。

但是,如果我首先通过触摸重置来重置动画,那么一切正常。换句话说,如果我一次又一次地按Flip,我只能得到一半的过渡...但是如果我先按Reset,那么一次翻转就完美了。

那么,我怎样才能让动画正确地重置?

以下是代码和屏幕截图,下面是完整链接:Project Zip File 700k

alt text http://www.robsteward.com/cardflip.jpg

- (void)displayWithImage1 {  //RESET button calls this 
    self.frame = rect1; 
    [image2 removeFromSuperview]; 
    [self addSubview:image1]; 
    [self setNeedsDisplay]; //no help: doesn't force an update before animation 
} 

- (void)runTheAnimation {  //FLIP button calls this 
    [self displayWithImage1]; //<---this is what the reset button calls 
    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDuration:0.5]; 
    [UIView setAnimationTransition:transition forView:self cache:NO]; 
    self.frame = rect2; 
    [image1 removeFromSuperview]; 
    [self addSubview:image2]; 
    [UIView commitAnimations]; 
} 

谢谢!

+0

我想出了一个半丑的解决方法。我添加了一个“虚拟”动画,并让我的班级成为其setAnimationDidStopSelector的代表。虚拟动画的持续时间为0.0,并将视图移动到rect1。当虚拟的停止选择器被调用时,我从上面执行“真实”的动画翻转代码。功能齐全,看起来至少有4个可以同时运行。耶,我。 LOL – Rob 2009-09-21 21:16:34

+1

原来,解决方法可能会产生长达半秒的延迟,所以我开始赏金。必须有一种方法来发送一个容器视图两个图像,并在一次转换中将其从一个翻转到另一个。 – Rob 2009-10-01 02:22:24

回答

12

为了在执行动画之前重新绘制视图,需要传递一个绘制循环。这段代码就是“绘制这个的一个例子,当下一个事件循环出现时,做其他事情。”在UI代码中执行此操作并不罕见。你的第一个解决方法是尝试同样的事情,但以更复杂的方式。

- (void)_runTheAnimation { 
    // Moved here from -runTheAnimation 
    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDuration:0.5]; 
    [UIView setAnimationTransition:transition forView:self cache:NO]; 
    self.frame = rect2; 
    [image1 removeFromSuperview]; 
    [self addSubview:image2]; 
    [UIView commitAnimations]; 
} 

- (void)runTheAnimation {  //FLIP button calls this 
    [self displayWithImage1]; 
    [self performSelector:@selector(_runTheAnimation) withObject:nil afterDelay:0.0]; 
} 
+1

太棒了!非常感谢。我完全不清楚选择器是否立即执行。现在一切都很好。 200代表赏金是一个小的代价。我花了10个小时搞这个。 – Rob 2009-10-01 03:21:26

+1

如果要求(-peformSelector :)立即发送选择器,则上面的方法是-performSelector:withObject:afterDelay:,它将在选择器的runloop上进行调度,以便将来在某个点发送。延迟0有效意味着“下一次运行循环迭代”。选择器本身只是描述了传递给对象的消息。传递该消息的行为由performSelector ...方法完成。 – 2009-10-01 11:50:53

+1

很酷,我想我明白了。仍然在加速Cocoa,Objective-C和iPhone的所有事情......但我现在学得更快。再次感谢。 – Rob 2009-10-01 15:26:18