我想动画,事实上淡化,“内”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中动画(淡化)背景颜色或图像?