【问题标题】:I want to animate, in fact fade, "within" drawRect我想动画,事实上淡化,“内”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,无论多么复杂,都视为一个巨大的块,并将其包装在该动画中。是的,它甚至包括在屏幕外区域绘制、位图渲染或其他任何内容。一切都变得生动起来。谁知道?

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

【问题讨论】:

    标签: iphone ios ipad cocoa-touch quartz-graphics


    【解决方案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 实例并在它们之间设置动画。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-06
        • 1970-01-01
        • 1970-01-01
        • 2012-12-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多