2013-07-27 53 views
3

我正在研究iPhone应用程序,它将显示包含图片和文本标签网格的大型可滚动和可缩放表面。我需要能够单独更改照片的位置并控制标签的不透明度。我试图通过使用UIScrollView和Core Animation来实现这些目标。使用透明CALayers平滑滚动UIScrollView

UIScrollView的子视图包含两个主要子图层:一个用于显示图片,另一个用于标签。图片是CALayers,其内容属性设置为CGImage,它们作为子图层添加到图片图层。标签是CATextLayers,它们是第二层的子层。标签图层的透明度根据滚动视图的缩放比例而变化。

这里的问题是:当标签是完全不透明或完全透明一切正常,但是当他们是半透明的滚动开始是干和FPS下降到约35。显然,这些混合层的减缓都记录下来,但我找不到解决的办法。 我将不胜感激关于如何改善这种情况下的性能的任何想法。也许有更好的方法来绘制文本标签比使用CATextLayer

回答

0

是否有可能将您的UIScrollView的两个“主图层”合并为一个?另外,是否可以将图层直接添加到UIScrollView的图层而不是添加其他图层?

我发现,通过减少包含其他图层的唯一目的而存在的图层数,我获得了巨大的性能。

+0

我将标签保留在单独的图层上,以便我可以一次调整所有图层的透明度。但我会尝试添加图片直接滚动视图的子视图的层,看看是否有帮助,感谢您的建议。 –

+0

啊,我明白了。在一天结束的时候,它会涉及到尝试不同的事情,因为性能问题总是情境化的。但是,我猜想Objective C快速枚举+单独设置alpha的速度比拥有容器层并更改其不透明度(您将少一层混合)要快。无论如何,让我知道你是否还有其他问题。 –

-1

一个解决方案是为图像层和文本图层的最背景层添加阴影。

有迹象表明,你可以调整即shadowPathshadowColorshadowOffsetshadowRadius阴影属性的数量 - 设置每个人,不要错过任何。还设置了yourlayer.masksToBounds = NO

不要忘记增加yourlayer.shouldRasterize = YES,因为这会对性能有更好的影响。

+0

为什么在他甚至不需要阴影会增加性能时添加阴影?你怎么知道在这种情况下,应用栅格化会提高性能?他可能会因为任何原因使图层失效,因为他会放大。 –

+0

阴影(即使宽度为0.01)也会消除锯齿状边缘,这可能与OP描述为“开始变干”的情况类似。我用阴影来平滑事情。栅格化对性能有更好的影响。就你所要缓存的每一层而言,在滚动时会重新绘制 - 这很好。看到这个 - http://stackoverflow.com/questions/11521959/uiview-self-layer-shouldrasterize-yes-and-performance-issues。在投降男人之前要小心。 –

+0

“生涩”我的意思是滚动时FPS较低,如果不清楚,则表示抱歉。我正在试验'shouldRasterize',但不幸的是这对我的情况没有帮助。对各个图片和/或标签进行光栅化并没有什么区别,并且对整个视图进行栅格化会使滚动速度更慢,并且会在显示位图部分时导致闪烁。 –