2011-05-05 49 views
5

我有一个很大的UIScrollView(contentSize 8000 x 960)与很多小标签。UIScrollView性能问题,因为大量的标签

只有当您滚动到标签所属的区域时才会添加标签。所以,起初,sc is流畅,但随着越来越多的标签被加载,性能受到越来越多的影响。

保持滚动平滑的最佳解决方案是什么? CATiledLayer是要走的路吗?还是应该隐藏视图标签或类似的东西?

非常感谢您的帮助!

斯特凡

编辑: 我画了一些对象,而不是使用意见时,得到了一个巨大的性能提升;但现在,我又遇到了另一个问题。如果我直接绘制到UIScrollView上,一切都很好。但是,如果我在UIScrollView上放置一个UIView并绘制它,性能会再次下降(这两次调用setNeedsDisplayInRect:在scrollViewDidScroll :)。

所以层次:
的UIWindow
的UIView
的UIScrollView < ==绘制这里

工作正常。

但层次:
的UIWindow
的UIView
的UIScrollView(大小8000x960)
的UIView(尺寸8000×960)< ==绘制这里

执行不好。

任何想法为什么?我需要上面的UIView,因为绘图应该高于一些UIViews;所以我把在滚动视图的UIViews并在上面的视图中绘制...

+0

你试过去除当前不可见的标签吗?顺便说一句,你的用例是由UITableView解决的。不知道你希望如何显示标签。 – 2011-05-05 12:15:38

+0

我刚刚做过;似乎没有帮助:(是不是在成百上千的视图循环,并确定视图应该是可见的开销,杀死性能增益? – swalkner 2011-05-05 13:32:43

+0

这是真的,列举在每个滚动事件的所有标签是不是一个好主意。你应该首先找到一个瓶颈,什么是Time Profiler仪器说的?它是否指向你的代码是最饥饿的代码? – 2011-05-05 14:23:41

回答

1

标签重用是可能的解决方案之一。有时候这并没有多大帮助。当一个新的UIView出现时,drawRect方法将被调用,这可能会导致动画问题。

有时最好的解决方案是直接使用Core Graphics绘制标签(我的意思是文本),而不用创建UILabel对象或其他东西。 CALayer会提高性能,但有可能它不会帮你很多。

但首先你应该记住,alpha = 0或hidden = YES的视图根本不会被绘制,所以使用它们不会有任何惩罚。也许你应该在使用Core Graphics之前尝试隐藏未使用的。

+1

我还问过亚历克斯S:是不是循环了数百个视图并确定视图是否应该可见而导致性能增益的开销? – swalkner 2011-05-05 13:33:03

+0

是的,我们在这里罚款。但是执行的唯一操作是像_if(隐藏|| alpha == 0.0)..._这样的检查。在比较每个视图的整个图层(甚至是几个图层)时,此操作需要很长的时间才能继续。所以我们可以假设所有这些检查都非常快速地完成。您应该避免使用数百个可见视图,但您可能会使用数百个看不见的视图。 – 2011-05-05 13:44:52

+0

这是正确的吗?在我scrollViewDidScroll:我做=> 为(UIView * subView在[myMainView子视图]){ subView.hidden = CGRectIntersectsRect(scrollView.bounds,subView.frame)== NO; – swalkner 2011-05-05 13:50:40

-1

难道ü尝试类似的东西UITableViewCell

dequeueReusableCellWithIdentifier 

使用reuseIdentifer重用一次分配的标签..

1

最好的方法是只有几个UILabel并重用它们。但是你必须实现- (void)scrollViewDidScroll:(UIScrollView *)scrollView并在那里做一些可重用的逻辑。根据情况,使用UITableView并将其转换90度可能会更容易,因此它看起来像一个滚动视图。这样你可以使用TableView的内置可重用逻辑。

+0

感谢您的回复!我该如何做到这一点?当他们滚动进出视图时,是否必须手动将它们从UIScrollView手动添加和删除? – swalkner 2011-05-05 12:02:10

+0

基本上你需要一个有10个左右UILabels的数组(与屏幕上显示的数量一样多)。你给每一个索引值(你可以使用“标签”属性或子类UILabel添加一个)。然后在滚动位置改变时,你从滚动偏移量计算出哪些指标需要显示,然后遍历你的UILabel数组。如果没有UILabel具有您当前的索引,请调整其中一个“免费”UILabel的x位置和内容。 – 2011-05-05 13:01:00

0

对于其他人看到这篇文章,我能够通过启用每个视图的“shouldRasterize”属性,大幅度提高性能并将UIViews保留在滚动条中,而无需使用表格。此属性在视图处于运动状态时将视图呈现为图像,使其无需为其移动的每个像素重新处理。所以,如果我有一个叫做按钮的UIButton,它可以像这样启用:

button.layer.shouldRasterize = YES; 
+0

是的。当你这样做时,也设置比例或你的视图会变成视网膜显示模糊:button.layer.rasterizationScale = [[UIScreen mainScreen] scale];这解决了我的所有性能问题与阴影。 – n13 2013-03-02 02:52:25