【问题标题】:Smooth animation using drawRect: and UIPanGestureRecognizer使用 drawRect: 和 UIPanGestureRecognizer 平滑动画
【发布时间】:2012-03-28 17:28:02
【问题描述】:

好的。我已经看到了很多与我在这里尝试做的类似的主题,但没有什么完全匹配的。也许我的方法是离谱的。这是交易。

我正在 drawRect: 中为我的 UIView 子类绘制图表。然后我使用 UIPanGestureRecognizer 将图表的偏移量(内部,不在视图层次结构中)转换为右/左。这很好用,但我的问题是识别器的动作以相对较低的频率触发。具体来说,生成的平移比滚动视图或表格视图中的平移要不稳定得多。特别是当我图表中的点数增加时。现在,我想做的实际上并不是从平移手势的动作中触发绘图,而是让计时器以每秒 30 次的速度触发,插入从平移触发到当前时刻的偏移量。然而,这变得越来越复杂。

有人有建议吗?我真的应该用 UIScrollView 来做这件事吗?我不想这样做的原因是数据可能会在任一方向上延伸很远,我不想一次绘制(或至少存储)整个路径,而只需执行当前的部分显示。我应该使用 CAShapeLayer 吗?在我花一天时间研究这些可能性之前,我想要一些输入...

非常欢迎任何意见/经验。

【问题讨论】:

  • 为什么在平移时会调用drawRect?你不是在移动视图吗?
  • 不,pan修改了我的“dataWindow”,这反映在drawRect中。视图本身不会移动或缩放。
  • 啊,所以每次滚动增量都会重新绘制?那会让事情慢下来。我见过的一个技巧是将数据渲染成图像,并且仅在新数据到达时才从数据中重绘,否则只需合成图像。或者将您的数据视图放入滚动视图中并且根本不重绘。找到解决方案后发布。
  • 是的,我正在考虑将其嵌入到滚动视图中。问题是数据可能在任一方向上无限延伸。随着我的进展,实现变得越来越复杂......

标签: ios core-graphics uigesturerecognizer smooth pan


【解决方案1】:

所以,最后,我确实把这些东西放在了 UIScrollView 中。我必须做很多工作才能启动并运行它,复杂的部分是创建一系列将添加到滚动视图中的 PANES。每个窗格都向代表询问它需要绘制的数据,然后将它们全部拼接在一起。幸运的是,一旦我将这些包含图表窗格的滚动视图放入表格视图中,一切都很好。仍然没有解决缩放问题,但我在这里看到了一些帖子,这应该使它相对微不足道。

这就是我最初问题的答案。不要试图在每一帧上平移和绘图,它会很不稳定,而且会出现一些真正的黑客攻击,我找不到平滑它的好方法。滚动视图可以为您处理所有这些问题,只要您可以很好地拆分视图。我想我可以使用一个长视图,但是当数据集变大时,我就有麻烦了。

现在我遇到了一个相关的问题——当屏幕外的图表滚动到视图中时(它们在 UITableViewCells 中),在绘制新图表时会出现很大的问题。我想我会尝试将它们异步绘制到图像中,这样当新行滚动到视图中时,我已经得到了图像。

【讨论】:

  • 你能贴一些代码或者解释一下吗?我正在做几乎相同的事情,但目前正在使用带有CAShapeLayer 的平移手势识别器,我在平移时更改位置并修改路径。不确定这是否是最佳做法,但工作顺利。现在的问题是,如果发现新的最大值,如何缩放事物,因为很难更改CGMutablePathRef。然后还有很多其他问题。
猜你喜欢
  • 1970-01-01
  • 2017-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-22
  • 2012-09-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多