代码之家  ›  专栏  ›  技术社区  ›  Ed Marty

如何在uiScrollView中滚动不确定大小的uiView

  •  7
  • Ed Marty  · 技术社区  · 16 年前

    我试图画一个水平方向无限大,与屏幕高度相同的图形。我添加了一个uiscrollview,以及其中一个uiview的子类,它实现了 -drawRect: 方法。在模拟器中,一切都很好,但是在设备上,当它达到一定的尺寸后,它似乎无法绘制出图形。

    我已经缓存了几乎所有我能缓存的东西,基本上只调用 -抽签: 第节。我只画屏幕上可见的东西。我有一个uiscrollview的委托,它监听 -scrollViewDidScroll: 然后告诉图形重新绘制自己( [graphView setNeedsDisplay] )

    我找到了一个方法,告诉我重写 +layerClass 方法和返回 [CATiledLayer class] . 这确实允许图形在设备上绘制,但它的功能非常差。这是令人难以置信的缓慢,实际绘制,和褪色发生是不可取的。

    有什么建议吗?

    4 回复  |  直到 13 年前
        1
  •  3
  •   Ed Marty    16 年前

    我的答案是:我基本上做了一些类似于uiTableView如何处理单元格的事情:我有一组不可变的graphview对象,这些对象存储了未使用的图。当滚动视图的某个部分可见时,我从该集合中获取一个图表视图(如果集合为空,则创建一个新视图)。它已经有了一个Scrollx属性来确定应该绘制它的哪个部分。我将scrollx属性设置为正确的值,而不是使用屏幕宽度,而是赋予它任意宽度进行绘制。当它退出滚动视图时,它将从uiscroll视图中删除并添加到集合中。

    我想知道,当它们消失在视野之外时,我是否真的需要将它们移除?只有当我收到内存不足警告时,才尝试将它们留在屏幕上,并删除不在屏幕上的那些内容是明智的?当需要重新绘制一段未更改的图形时,这可能会消除暂停。

    我在这里保存的优雅之处是我的graphview已经设置为只绘制图表的一部分。那时我所需要做的就是做不止一个。

        2
  •  2
  •   Marc Novakowski    16 年前

    我认为这是iPhone图形硬件的一个限制。通过实验,我发现iPhone将拒绝绘制高度或宽度超过2000像素的帧。它可能与硬件中帧缓冲区的有限大小有关。

        3
  •  1
  •   EricS    13 年前

    观看名为“会话104-高级滚动查看技术”的2011年WWDC会话视频。

        4
  •  0
  •   Tony Tonev    16 年前

    谢谢,这很有帮助。一个问题——uiscrollview的contentSize使用了什么?只要不创建缓冲区来填充内容视图中的整个空间,uiscrollview是否允许大的内容大小(超过2000像素)?或者,每次绘制时(使用scrollx而不是contentoffset来存储位置),是否保持uiscrollview的大小不变(例如,2个屏幕宽度)并保持uiscrollview contentoffset属性?

    我想我回答了我自己的问题(后者似乎是更好的选择),呵呵,但我会继续发表这篇文章,以防其他人需要澄清。