Iphone UIScrollView性能问题,因为标签太多

Iphone UIScrollView性能问题,因为标签太多,iphone,uiscrollview,Iphone,Uiscrollview,我有一个相当大的UIScrollView(contentSize 8000 x 960),有很多小标签 仅当滚动到标签所属的区域时,才会添加标签。因此,一开始,crooling是平滑的,但随着越来越多的标签被加载,性能受到越来越多的影响 保持滚动平滑的最佳解决方案是什么?CATiledLayer是我们要走的路吗?或者视图上的标签应该隐藏或类似的东西 非常感谢你的帮助 斯特凡 编辑: 当我绘制一些对象而不是使用视图时,我得到了巨大的性能提升;但现在,我有另一个问题;如果我直接在UIScrollVi

我有一个相当大的UIScrollView(contentSize 8000 x 960),有很多小标签

仅当滚动到标签所属的区域时,才会添加标签。因此,一开始,crooling是平滑的,但随着越来越多的标签被加载,性能受到越来越多的影响

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

非常感谢你的帮助

斯特凡

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

So层次结构:
UIWindow
UIView

UIScrollView您是否尝试过类似于
UITableViewCell

dequeueReusableCellWithIdentifier

使用
reuseIdentifer
重用曾经分配的标签。

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

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

有时,最好的解决方案是直接使用核心图形绘制标签(我指的是文本),而不创建UILabel对象或其他东西。CALayer将提高性能,但也有可能对您帮助不大


但首先您应该记住,alpha=0或hidden=YES的视图根本不会被绘制,因此使用它们不会受到惩罚。在使用核心图形之前,也许您应该尝试隐藏未使用的视图。

对于其他看到这篇文章的人,通过启用每个视图的“shouldRasterize”属性,我可以大幅提高性能并将UIView保留在滚动条中,而不必使用表格。当视图处于运动状态时,此属性将视图渲染为图像,从而不需要对其移动的每个像素进行重新处理。因此,如果我有一个名为button的UIButton,它会像这样被启用:

button.layer.shouldRasterize = YES;

谢谢你的回复!我该怎么做呢?当它们在视图中滚动时,我是否必须始终手动在UIScrollView中添加和删除它们?基本上,您需要一个包含10个左右UILabel的数组(屏幕上显示的UILabel数量加上更多的UILabel)。您为每一个添加一个索引值(您可以使用“tag”属性或子类UILabel add one)。然后在滚动位置更改时,根据滚动偏移量计算需要显示的索引,然后遍历UILabel数组。如果没有UILabel具有当前索引,请调整其中一个“自由”UILabel的x位置和内容。是否尝试删除当前不可见的标签?顺便说一下,您的用例是通过UITableView解决的。但我不确定你希望你的标签如何显示。我刚刚做了;似乎没有帮助:(在数百个视图上循环并确定视图是否可见的开销是否会降低性能增益?没错,在每次滚动事件中枚举所有标签不是一个好主意。你应该首先找到瓶颈。时间分析器工具说什么?它是否指向你的代码作为hun最糟糕的一个?我甚至觉得自己似乎没有必要隐藏对象;如果我滚动到一个非常空的区域,滚动会再次平滑…是不是iOS自己能处理这个问题?嗯,是的,肯定是这样。我不确定我是否理解这个问题。当你滚动到一个有很多标签的区域时,性能会受到影响?可以吗你展示了你想要实现的目标的屏幕截图?使用大量标签可能不是最好的解决方案。我还问Alex S:循环数百个视图并确定视图是否可见的开销是否会扼杀性能提升?是的,我们这里有一个惩罚。但执行的唯一操作是检查是否(隐藏| | alpha==0.0)…与重绘整个层(甚至几个层)相比对于每个视图,此操作都需要很长的时间才能继续。因此,我们可以假设所有这些检查都非常快地完成。您应该避免使用数百个可见视图,但也可以使用数百个不可见视图。这是否正确?在我的scrollViewDidScroll中:我正在为(UIView*子视图[myMainView子视图]中的子视图=>for){subView.hidden=CGRectIntersectsRect(scrollView.bounds,subView.frame)==否;@swalkner:您提供的代码肯定能工作,但我不确定它是否能解决您在动画方面的问题。如果不行,我建议您扔掉所有UIView,直接使用核心图形绘制所有文本和图像。这应该用drawRect方法完成。@swalkner:我记得UIScrollView会向任何人发送drawRect消息UIView将变得可见。因此空区域将以平滑动画显示:)。您应该编写自己的视图并自己处理所有图形。这样动画将更加平滑。是的。当您这样做时,还可以设置比例,否则您的视图将在视网膜显示上变得模糊:button.layer.rasterizationScale=[[UIScreen mainScreen]缩放];这修复了我的所有投影性能问题。