ios - 当位置数量发生变化时,无法为 CAGradientLayer 的位置属性设置动画
问题描述
我创建了一个UICollectionView
视图的顶部和底部有渐变的地方。当您滚动到视图底部时,渐变消失。我想动画这个变化。
在我的UICollectionView
课堂上:
func setupTopAndBottomGradientMask() {
let coverView = GradientView(frame: self.bounds)
guard let coverLayer = coverView.layer as? CAGradientLayer else {
return
}
coverLayer.colors = [UIColor.clear.cgColor,
UIColor.black.cgColor, UIColor.black.cgColor, UIColor.clear.cgColor]
coverLayer.locations = [0.0, 0.07, 0.93, 1.0]
self.mask = coverView
}
func setupTopGradientMask() {
let coverView = GradientView(frame: self.bounds)
guard let coverLayer = coverView.layer as? CAGradientLayer else {
return
}
coverLayer.colors = [UIColor.clear.cgColor, UIColor.black.cgColor]
coverLayer.locations = [0.0, 0.07]
self.mask = coverView
}
在scrollViewDidScroll
我的中,UIViewController
我添加了代码来动画从setupTopAndBottomGradientMask()
状态到setupTopGradientMask()
状态的变化:
let colorsAnimation = CABasicAnimation(keyPath: "colors")
colorsAnimation.fromValue = [UIColor.clear.cgColor, UIColor.black.cgColor,
UIColor.black.cgColor, UIColor.clear.cgColor]
colorsAnimation.toValue = [UIColor.clear.cgColor, UIColor.black.cgColor]
let locationsAnimation = CABasicAnimation(keyPath: "locations")
locationsAnimation.fromValue = [0.0, 0.07, 0.93, 1.0]
locationsAnimation.toValue = [0.0, 0.07]
let removeBottomGradientAnimationGroup = CAAnimationGroup()
removeBottomGradientAnimationGroup.animations = [colorsAnimation,
locationsAnimation]
removeBottomGradientAnimationGroup.duration = 2
removeBottomGradientAnimationGroup.timingFunction =
CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
let existingMaskLayer = mainCollectionView.mask?.layer as? CAGradientLayer
existingMaskLayer?.colors = [UIColor.clear.cgColor, UIColor.black.cgColor]
existingMaskLayer?.locations = [0.0, 0.07]
mainCollectionView.mask?.layer.add(removeBottomGradientAnimationGroup, forKey: "removeBottomGradientAnimationGroup")
此代码创建正确的最终 UI,但它没有动画。这是 UI 的截屏视频,其中渐变更改但没有动画
我确认如果位置数组的大小相同locationsAnimation.fromValue
,locationsAnimation.toValue
那么它确实会动画。
CABasicAnimation
我的问题:如果不支持具有不同位置数量的 CAGradientLayers 之间的动画,我该如何实现我想要的动画?
解决方案
发生这种情况并不让我感到惊讶。在CAShapeLayer
. 在这种情况下,路径中控制点的数量和类型在开始和结束时必须相同,否则动画结果未定义。
您需要找出数组中仍然有 4 种颜色的等效动画。
[clear, black, black, clear]
您从到[clear, black]
和 从 位置动画[0.0, 0.07, 0.93, 1.0]
到[0.0, 0.07]
。
为什么不 使用相同的开始和结束位置[clear, black, black, clear]
来制作动画。[clear, black, black, black]
那应该会产生相同的效果。
推荐阅读
- android - 为什么 SurfaceFlinger 在其主函数中注册了 GraphicsAllocatorService 和 DisplayService?
- python - Ray Tune 增加内存使用率
- c++ - 一个关于描述符和反射的protobuf问题
- generative-adversarial-network - 为什么 c1 在 InfoGAN 中捕获数字类型?
- python - 在 Flask 或 FASTAPI 中处理 Webhook
- r - R:正确使用 fct_infreq 函数
- python - 如何将 GET 响应转换为 pandas 数据框?
- sql - 锁表有必要吗?
- python - Pandas df:根据自定义列表按索引排序
- swift - 当点击一行中的按钮时,如何将列表中的选定对象传递给第二个视图