【问题标题】:Custom UIView drawRect Animation自定义 UIView drawRect 动画
【发布时间】:2014-01-27 02:15:21
【问题描述】:

我正在制作一个自定义 UIView 子类,它可以绘制图形(在我自己的 drawRect 方法中)并响应触摸事件。我需要让图表的各个部分都具有动画效果(例如闪烁的热点或在触摸事件后使平移减速)。

驱动动画的参数对我的视图来说是完全私有的,我希望将这些行为封装在类中。 IE。我不希望承载此视图的视图必须做任何事情来完成这项工作。我的视图知道它需要多久重绘一次,我希望它能够控制它。

我的直觉是在我的视图类中创建一个计时器来运行我的动画,但我无法让它触发,而且我得到的印象不是这里的最佳实践。

我需要一种方法让我的视图请求定期调用它的 drawRect 并且理想情况下能够动态控制该周期(这样当发生的事情较少时我可以减慢它的速度)。

我查看了一些 CoreAnimation 方法,但它们对我来说似乎有些矫枉过正,但如果它是正确的方法,我愿意投入其中。

是否有一种简单的方法可以让我定期调用视图的 drawRect 方法?我可以控制它发生的频率吗?

【问题讨论】:

标签: ios objective-c animation uiview drawrect


【解决方案1】:

你不应该直接调用drawRect。而是调用setNeedsDisplay,它调用drawRect。

更改drawRect中的几个参数并调用setneedsdisplay,它会再次渲染你的视图。

但是非常频繁地调用drawRect会影响你应用的性能。Apple甚至建议遵循CAAnimations-core动画做动画不要调用drawRect进行动画。

【讨论】:

  • 我正在从我的视图中调用 [self setNeedsDisplay],但我在 drawRect 方法结束时调用它(我知道我需要再次绘制)并且它不会触发另一个绘制矩形。好像要被压制了我没有其他地方可以调用 [self setNeedsDisplay]。
  • 好吧,它不会那样工作。你试图递归地调用它,但它不会发生。它只调用一次。而是调用为 [self performSelector:@selector(setNeedsDisplay) withObject:nil afterDelay:2.0];
【解决方案2】:

Santhu 的评论最能回答我的问题。

对于非常简单的动画,我可以使用这种机制来定期刷新我的视图:

[self performSelector:@selector(setNeedsDisplay) withObject:nil afterDelay:2.0];

我认为对于更复杂的事情,我会深入研究 CoreAnimation 的东西,我敢肯定它没有乍看起来那么复杂。

【讨论】:

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