2011-05-09 72 views
0

我有一个甘特图,我想在iphone上可见。如何平滑滚动浏览大型uiscrollview上的600ishuilabels(iphone)

它是7200 x 1800px大,由〜600条,其中每个是一个UILabel。

这是这个样子:

Gannt

现在我已经得到了它的工作。在〜100条,我可以通过简单地将它们全部添加到滚动视图来使它运行得非常顺利。然而,当完整的600(或更多)最终崩溃时,我实例化所有这些uilabels并将它们全部添加到子视图的滚动视图中。

所以我所做的是让它只为当前可见的行创建uilabels,并且随着用户向上和向下滚动,它将删除不可见的uilabels并添加新可见的行。

但是,当您垂直滚动,因为它横跨每个行边界,并且必须渲染另一行并删除旧行时,这种抽动非常明显。

有没有人有任何建议来解决这个问题?任何想法什么是缓慢的部分?实例化uilabels,或将它们添加为子视图或其他任何东西?

所有帮助将不胜感激。

+0

我已经尝试将隐藏的标签合并为滚动,并重新使用它们以节省分配新显示的内容,但它不会加快速度。 – Chris 2011-05-09 06:42:28

+0

这可能是内存问题,您的手机是否自动释放? – Jhaliya 2011-05-09 06:49:22

+0

您是否尝试过移动标签而不是隐藏它们? – 2011-05-09 07:00:18

回答

3

苹果有一些非常好的演示代码,说明如何做到这一点。检查出TiledScrollView.m特别是layoutSubviews方法。

其他的事情你可能会考虑:

  • 如果标签相当长的水平,可能需要将它们分解成更小的块。在这种情况下,相当长的时间比屏幕更宽。

  • 确保您的UILabels不透明。滚动需要合成的东西会增加额外的开销,这可能会解决您的一些问题。

  • 看着你的屏幕截图,行和列标题不是不透明的,而是使用了alpha。鉴于这是一个很好的效果,它可能暂时让它们变得不透明,只是为了看看这是否会对你的问题造成影响。我认为这不会对您的问题做出太多贡献。正在合成的区域非常小。

+0

这个想法是从滚动视图中构建一种表视图,它现在可以回收图像块(或标签,而不是您的情况)的细胞。滚动视图是子类,一组可重用的图块保留为其实例变量之一。正如@idz指出的那样,实现的关键是在'layoutSubviews'中从超级视图中移除已移出可见区域的图块,然后为新显示的内容回收图块并将其添加为子视图。通过这种方式,只有可见的图块被加载到内存中......你应该看看这个演示; Apple为您提供了完整的代码,使其更快更流畅。 – 2011-05-09 08:39:41

+0

非常感谢您指出该演示,我会看到我可以从中收集... – Chris 2011-05-09 23:24:46

+0

@Chris,不客气!我用它来做和你所做的很相似的事情。就我而言,它必须在iPad(以及iPhone)上工作,因此一次可以看到更多的标签。它确实很好地工作。 – idz 2011-05-09 23:43:42

1

只是一个想法,但问题可能在于,即使您正在缓存并重新使用标签,滚动视图仍会保留它们,因此即使您只有少数标签,每个标签仍会保留数百次。如果是这样,那么我会认为滚动视图仍然有效地试图管理这几百行。

所以@Nathon S问 - 你移动它们吗?即构建一组有限的标签并在滚动视图上移动它们以匹配观看区域。如果你隐藏并重新添加到滚动视图,那么我会怀疑一大组留存减速。我认为,通过移动标签设计,您不需要在初始显示之后进行任何隐藏并添加。这应该使它非常快速和轻量级。

+0

我试过两种方法 - 在滚动条中添加和删除它们(在删除之前将它们存储在“池”数组中),以及尝试简单地移动它们。两者都很慢。 – Chris 2011-05-09 08:11:41

+0

好吧,我没有这方面的经验知道,所以这可能是完全错误的:-)但你有没有检查过所有的“动作”是在同一个动画块中完成的?我记得阅读关于它的一些与图形性能有关的东西。 – drekka 2011-05-09 08:14:35

+0

嗨德里克,没有动画块,我只是让uiscrollview进行正常的滚动 – Chris 2011-05-09 23:25:13