在Android上,我有一个水平滚动列表中可能具有大宽度的项目视图。随着视图的部分变得可见于列表,该视图会加载并绘制"图像"块。这是一种优化方式,避免了一次性绘制所有图像,因为这样做既浪费又缓慢。绘制的内容本质上是音频波形。由于需要工作的方式,我无法将块拆分为列表上的单个视图项。这种策略非常适用于Android绘图架构的工作方式。
现在我正在尝试在iOS中使用类似的模式,但我遇到了一些问题,而且我不太确定如何找出解决方案。
在iOS中,我们使用
解决方案1:
检查
解决方案2:
使用自定义的
更新 1
我正在研究使用
更新2
经过大量测试和试验,使用解决方案1并不可行。当
现在我正在尝试在iOS中使用类似的模式,但我遇到了一些问题,而且我不太确定如何找出解决方案。
在iOS中,我们使用
UICollectionView
绘制大宽度的单元格,并且我们需要相同的优化来仅加载和绘制可见的块。
解决方案1:
检查
UIView
的哪些部分是可见的,仅绘制那些可见的块。然而,这种解决方案的问题在于,随着UICollectionView
的滚动,UIView
不会绘制正在变得可见的下一块。以下是相关示例。
UIView
加载初始块
这些可以通过它们不同的块颜色来看到:
向下滚动一点
黑色被显示出来,因为没有提示需要重新绘制视图,所以我们无法加载下一个可见块。
解决方案2:
使用自定义的
UIView
,由CATiledLayer
支持。这个方法非常完美,因为它会在滚动UICollectionView
时绘制可见的瓦片。问题是绘制发生在后台线程或下一个绘图周期(如果定义了shouldDrawOnMainThread
)。当UIView
被调整大小或我的内部缩放逻辑启动时,会出现问题。因为绘图周期未与视图调整大小同步,所以事物会发生变化。
那么我该如何像 CATiledLayer
一样被通知某个部分正在变得可见,然后可以像支持 UIView
的 CALayer
一样正常绘制呢?
更新 1
我正在研究使用
preferredLayoutAttributesFittingAttributes
作为一种检查是否需要绘制新块的方法。这会在每次由于滚动而将单元格移动到新位置时调用。希望这不是个坏主意。 :)- (UICollectionViewLayoutAttributes *)preferredLayoutAttributesFittingAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes
更新2
经过大量测试和试验,使用解决方案1并不可行。当
UIView
达到巨大的宽度时,内存使用量会飙升,而使用CATiledLayer
时内存使用量最小,正如我所料。 :/
func draw(_ rect: CGRect)
吗? - MichaelVfunc setNeedsDisplay(CGRect)
?您可以提供额外的标志,仅在要求绘制特定矩形时才进行绘制,并在标志关闭时不进行绘制。 - MichaelV