我想动画,实际上是淡入淡出,“在”drawRect中

有没有办法让drawRect 从上一个场景动画到下一场?

(令人惊讶的是) 你可以在drawRect中制作动画 – 尝试一下。 您可以淡化,翻译或动画任何其他属性。

然而,它从空白开始“从新鲜”开始。 因此,例如,如果您在drawRect中放置淡入式动画块,则前一个场景消失,新场景将从白色渐弱。

我希望屏幕从上一个图像 (在上一个drawRect循环中绘制)淡化到刚刚绘制的新图像…错误,正在绘制。

有没有办法做到这一点,也许通过操纵drawRect正在发生的事情来狡猾?

这似乎是一个非常常见的用例 – 从一个场景混合到另一个场景

有人知道这个秘密吗?

当然,显然这可以在核心动画环境中或以许多其他方式完成,但是将drawRect从一个drawRect淡化到下一个是一个明显的想法。 干杯。

由于WrightCS的天才,令人震惊的更新……

感谢WrightCS,我们现在知道drawRect可以完美地处理动画。 只需将此代码粘贴到任何drawRect的末尾并尝试:

self.alpha = 0.0; [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:2]; self.alpha = 1.0; [UIView commitAnimations]; 

它将整个drawRect视为一个巨大的块并将其包装在该动画中,无论它有多复杂。 是的,它甚至包括在屏幕外区域绘制,位图渲染或其他任何东西。 一切都变得生动了。 谁知道?

手头的问题 – 如何让它从前一个场景开始动画而不是从空白开始?

有点太晚了,但我也在寻找这个问题 ,而这个问题的接受答案就像drawRect里面的魅力一样。

画笔是看不见的。 它发生在’backbuffer’中,只有当你准备好使用drawRect时,iOS才会在屏幕上显示。 所以你绝对不能在画面中制作动画。 但是,您可以从几乎任何地方提交动画指令,包括drawrect。 但动画将在之后执行。

动画需要定时并向用户显示不同的帧。

你可以自己完成所有这些工作(不断地强制重绘并在每个时间做一些略微不同的事情),但这是很多工作,特别是如果你想要正确完成的话。

幸运的是,iOS为您编写了许多动画效果。 使用Core Animation,或UIKit中的(更简单和基本)动画。 但由于它通过动画视图的某些属性(例如整个视图的alpha或整个视图的旋转,……)来工作,因此您可能需要重新排列视图和子视图以充分利用它。

例如,每个马肢都是独立的子视图,你可以设置它们的转换动画(不需要重绘,iOS将完成剩下的工作)

例如,旧框架和新框架是两个单独的视图,您可以为从alpha 0到alpha 1的新框架(位于顶部)设置动画。

您可以为alpha设置动画:

 [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:2.0]; myObject.alpha = 0.0; [UIView commitAnimations]; 

如果你在iOS 5.0+以下,你可以使用以下内容:

 ... [UIView animateWithDuration:0.3 delay:0.0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{ //do your stuff here }completion:^(BOOL finished) { //completition stuff go here }]; ... 

您可以做的最好的事情是使用两个UIView实例并在它们之间设置动画。

当您开始动画时,您必须知道动画的原始状态和最终状态。 如果这只是一个观点,这很难。