Ios 当在UIScrollView中滚动到屏幕外时,CALayer将丢失光栅化

Ios 当在UIScrollView中滚动到屏幕外时,CALayer将丢失光栅化,ios,uiscrollview,calayer,Ios,Uiscrollview,Calayer,我有一些很好的自定义UIView,它们使用CALayers制作一些相当精细的遮罩和透明胶片。我花了一段时间才弄明白如何使其平滑运行,但我发现,通过将相关对象包装在容器UIView中,并将容器的layer.shouldRasterize设置为“是”,但将所有包含视图的属性设置为“否”,无论混合多么复杂,它都会平滑运行 基本上是这样的: UIScrollView 容器视图(layer.shouldRasterize=YES) 子项(layer.shouldRasterize=NO) child

我有一些很好的自定义UIView,它们使用CALayers制作一些相当精细的遮罩和透明胶片。我花了一段时间才弄明白如何使其平滑运行,但我发现,通过将相关对象包装在容器UIView中,并将容器的layer.shouldRasterize设置为“是”,但将所有包含视图的属性设置为“否”,无论混合多么复杂,它都会平滑运行

基本上是这样的:

UIScrollView


容器视图(layer.shouldRasterize=YES)

  • 子项(layer.shouldRasterize=NO)
    • childOfChild(layer.shouldRasterize=NO)
  • 子项(layer.shouldRasterize=NO)
  • 子项(layer.shouldRasterize=NO)
容器

集装箱…(等等)



基本上,当容器光栅化时,它最终会成为一个大的块图像,从而最小化必须进行的光栅化量。然而,这给我带来了一个新问题。如果一个UIScrollView中有多个容器,一旦其中一个容器滚到屏幕外,它就会在CoreAnimation profiler中被标记为“红色”,因此当它滚回到屏幕上时必须再次渲染。这会引起短暂的口吃。我不明白为什么容器的层必须重新光栅化。谁能解释一下,或者提供一个解决办法?谢谢。

您可以保存图层的图像(假设渲染后不会更改),然后在静态图像之间滚动

要从CALayer创建UIImage,请尝试Todd Yandell的解决方案:

或者,要从UIView创建UIImage,请尝试Tommy的解决方案: