如何在一个大的uiscrollview(iphone)上顺利滚动600个uilabels

时间:2011-05-09 06:39:56

标签: iphone objective-c uiscrollview uilabel

我有一点甘特图,我想在iphone上看到。

大小为7200 x 1800px,由约600个小节组成,每个小节都是UILabel。

看起来像这样:

Gannt

现在我已经开始工作了。在大约100个小时,只需将它们全部添加到滚动视图中,我就可以使它运行得非常流畅。但是,当我实例化所有这些uilabels并将它们全部添加到滚动视图作为子视图时,只有完整的600(或更多)它会崩溃。

所以我所做的就是让它只为当前可见的行创建uilabels,当用户向上和向下滚动时,它会删除不可见的uilabels并添加新显示的uilabels。

然而,当你跨越每一行边界时垂直滚动时,这种情况非常明显,并且必须渲染另一行并删除旧行。

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

非常感谢所有帮助。

2 个答案:

答案 0 :(得分:3)

Apple有一些非常好的演示代码,展示了如何执行此操作。查看TiledScrollView.m,尤其是layoutSubviews方法。

您可能会考虑的其他事项:

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

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

  • 查看屏幕截图,行和列标题不是不透明的,而是使用alpha。虽然这是一个很好的效果,但也可能暂时使它们不透明,只是为了看看这是否会导致你的问题。我认为这不会对你的问题造成太大影响;合成的区域非常小。

答案 1 :(得分:1)

只是一个想法,但问题可能是即使你正在缓存和重复使用标签,滚动视图仍然保留它们,所以即使你可能只有几个标签,每个都被保留了数百次。如果是这样,那么我认为滚动视图仍然有效地尝试管理那些数百行。

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