我正在尝试绘制一个水平无限大的图形,并且与屏幕的高度相同。我在其中添加了一个UIScrollView和一个UIView的子类,它实现了-drawRect:
方法。在模拟器中,一切正常,但在设备上,它似乎无法在图形达到一定大小后绘制。
我已经尽可能地缓存了所有内容,并且基本上只在-drawRect:
部分调用了CGContextAddLineToPoint。我只画出屏幕上可见的内容。我有一个UIScrollView的委托,它监听-scrollViewDidScroll:
,然后告诉图表重绘自己([graphView setNeedsDisplay]
)。
我找到一种方法告诉我覆盖+layerClass
方法并返回[CATiledLayer class]
。这确实允许图形实际在设备上绘制,但它的功能非常差。实际绘制速度非常慢,并且发生的淡入淡出是不可取的。
有什么建议吗?
答案 0 :(得分:3)
嗯,这是我的答案:我基本上做了类似于UITableView如何使用单元格的东西:我有一个GraphView对象的NSMutableSet,用于存储未使用的图形。当滚动视图的一部分变得可见时,我从该集合中获取图形视图(如果该集合为空,则创建一个新的图形视图)。它已经有了一个scrollX属性来确定它应该绘制的部分。我将scrollX属性设置为正确的值,而不是使用屏幕宽度,我给它任意宽度绘制。当它离开滚动视图时,它将从UIScrollView中删除并添加到集合中。
我想知道,当他们走出视野时我是否真的需要删除它们?只有当我收到内存不足的警告时,尝试将它们留在屏幕并删除不在屏幕上的屏幕可能是明智的吗?每当需要重绘未更改的图形部分时,这可能会消除暂停。
我在这里保存的优点是我的GraphView已经设置为仅绘制图形的一部分。我需要做的只是制作不止一个。
答案 1 :(得分:2)
我认为这是iPhone图形硬件的限制。通过实验,我已经看到iPhone将拒绝在高度或宽度上绘制一个大于2000像素的框架。它可能与硬件中帧缓冲区的有限大小有关。
答案 2 :(得分:1)
观看名为“会话104 - 高级滚动视图技术”的2011 WWDC会话视频。
答案 3 :(得分:0)
谢谢,这很有帮助。一个问题 - 您对UIScrollView的contentSize使用了什么?只要您没有创建缓冲区来填充内容视图中的整个空间,UIScrollView是否容忍大内容大小(超过2000像素)?或者你是否保持UIScrollView的大小(例如,2个屏幕宽度)并在每次绘制时保持UIScrollView contentOffset属性(使用scrollX而不是contentOffset来存储你的位置)?
我想我回答了我自己的问题(后者似乎是一个更好的选择),呵呵,但我会继续发布,以防其他人需要澄清。