我想动画,事实上淡化,“内”drawRect

Posted

技术标签:

【中文标题】我想动画,事实上淡化,“内”drawRect【英文标题】:I want to animate, in fact fade, "within" drawRect 【发布时间】:2011-01-18 23:09:26 【问题描述】:

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

(太棒了)你可以在 drawRect 中制作动画 - 试试看。您可以淡化、平移或动画任何其他属性。

但是,它从“新鲜”开始,从空白开始。 例如,如果您在 drawRect 中放置一个淡入动画块,前一个场景会消失并新场景将从白色淡出。

我想让屏幕从上一个图像(在 drawRect 的上一个循环中绘制)淡化为我刚刚绘制的新图像... err, am绘图。

有没有办法做到这一点,也许是通过操纵 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,无论多么复杂,都视为一个巨大的块,并将其包装在该动画中。是的,它甚至包括在屏幕外区域绘制、位图渲染或其他任何内容。一切都变得生动起来。谁知道?

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

【问题讨论】:

【参考方案1】:

Drawrect 是不可见的。它发生在 ios 显示在屏幕上的“后台缓冲区”中,仅当您准备好使用 drawRect 时。所以你绝对不能在drawrect中制作动画。但是,您几乎可以从任何地方提交动画指令,包括 drawrect。但动画会在之后执行。

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

你可以自己做这一切(不断地强制重绘,每次都在 drawrect 中做一些稍微不同的事情),但这是很多工作,特别是如果你想把它做好的话。

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

例如每个马肢都是单独的子视图,您可以为它们的变换设置动画(无需重绘,其余的由 iOS 完成)

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

【讨论】:

我并不是说代码会失败,但它永远不会以这种方式从以前的关键帧淡入到当前。 一开始使用动画有点棘手,直到您意识到所有可动画属性都存储了两次:您在代码中访问的那个是“目标”,而 coreanimation 计算的是“中途”值实际显示在屏幕上。 CommitAnimations 立即返回控制权,实际动画将在之后发生,您无需再关心它。那就是你可以从drawrect中调用它(我会调整我的答案)【参考方案2】:

您可以为 alpha 设置动画:

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

【讨论】:

不,你不能从 drawRect: 内部这样做!在另一个地方做,不要费心在你的 drawRect 里面做动画:【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

当您开始动画时,您必须知道动画的原始状态和最终状态。如果只有一个视图,那就很难了。

【讨论】:

以上是关于我想动画,事实上淡化,“内”drawRect的主要内容,如果未能解决你的问题,请参考以下文章

如何淡化动画背景图像(全尺寸)[关闭]

jQuery:悬停链接时在div中动画(淡化)背景颜色或图像?

AngularJS 1.2从0到0.5的淡入淡出动画不起作用

jQuery同时动画和淡化背景图像

JavaScript jCarousellite淡化动画

动画淡化链接的代码[关闭]