使用透明CALayer实现流畅滚动的UIScrollView

3
我正在开发一款iPhone应用程序,它将显示一个大型可滚动和可缩放的表面,其中包含一个图片和文本标签的网格。我需要能够单独更改图片的位置并控制标签的不透明度水平。我尝试使用UIScrollView和核心动画来实现这些目标。
UIScrollView的子视图包含两个主要的子层:一个用于显示图片,另一个用于标签。图片是带有内容属性设置为CGImage的CALayer,并作为子层添加到图片层中。标签是CATextLayer,并且是第二层的子层。标签层的透明度随着滚动视图的缩放比例而改变。
问题在于:当标签半透明时,一切都正常工作,但是滚动开始变得卡顿,FPS降至约35。显然,这些图层的混合会减慢一切速度,但我找不到解决方法。在这种情况下,也许有比使用CATextLayer更好的绘制文本标签的方法?
2个回答

0

你能否将 UIScrollView 的两个“主层”合并成一个?此外,你能否直接向 UIScrollView 的层添加图层,而不是添加额外的图层?

我发现通过减少仅用于包含其他图层的图层数量,可以获得巨大的性能提升。


我将标签放在单独的图层上,这样我就可以一次性调整它们的透明度。但我会尝试直接将图片添加到滚动视图子视图的图层中,看看是否有帮助,感谢建议。 - qbba.lys
啊,我明白了。归根结底,这取决于尝试不同的方法,因为性能问题总是情境相关的。然而,我猜测Objective C快速枚举+逐个设置alpha比拥有一个容器层并改变其不透明度更快(你会少一个需要混合的层)。无论如何,如果您有任何其他问题,请告诉我。 - Dany Joumaa

-1

一种解决方案是在图像层和文本层的最底层添加阴影。

有许多阴影属性可以调整,例如shadowPathshadowColorshadowOffsetshadowRadius - 设置每个属性,不要漏掉任何一个。还要设置yourlayer.masksToBounds = NO

不要忘记添加yourlayer.shouldRasterize = YES,因为这将具有更好的性能影响。


为什么即使不需要阴影,添加阴影也会提高性能?而且在这种情况下,如何知道 shouldRasterize 会提高性能?当他缩放时,他可能会因为某些原因使图层无效。 - Dany Joumaa
阴影(即使宽度为0.01)可以消除锯齿边缘,这可能是OP所描述的“开始变得卡顿”的情况。我使用阴影来平滑事物。栅格化对性能有更好的影响。只要您缓存每个图层,将在滚动时重新绘制 - 这很好。请参见此- https://dev59.com/SWgu5IYBdhLWcg3wLEI9。在投票之前要小心。 - Nirav Bhatt
我所说的“jerky”是指滚动时低帧率,如果不清楚,很抱歉。我正在尝试使用shouldRasterize,但不幸的是在我的情况下没有帮助。单独对图片和/或标签进行光栅化没有任何区别,而对整个视图进行光栅化会使滚动变得更慢,并且会导致位图的部分显示出现闪烁。 - qbba.lys

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接