我的应用程序显示了在风扇主体和背景前旋转风扇叶片的动画。刀片的图像是一个PNG,透明度位于UIImageView中,我可以应用投影,或者使视图旋转得很好。但我的问题是投影也随图像一起旋转,好像光源也在旋转。
下面的代码可以很好地创建投影和旋转图像,但阴影会随着刀片一起旋转,当然看起来并不真实。如何让光源保持静止并重新计算每帧动画的阴影?
func startRotating(_ duration: Double = 2) {
let kAnimationKey = "rotation"
if self.layer.animation(forKey: kAnimationKey) == nil {
self.layer.shadowColor = UIColor.black.cgColor
self.layer.shadowOpacity = 0.8
self.layer.shadowOffset = CGSize(width: 1, height: 1)
self.layer.shadowRadius = 2
let animate = CABasicAnimation(keyPath: "transform.rotation")
animate.duration = duration
animate.repeatCount = Float.infinity
animate.fromValue = 0.0
animate.toValue = Float(.pi * 2.0)
self.layer.add(animate, forKey: kAnimationKey)
}
}
对前两条评论的回应:
两个评论错过的问题是风扇叶片投射的阴影根据叶片旋转的位置而变化,但光源的视在位置不应该。想象一下典型的下降阴影和水平风扇叶片的右侧,比如45°。它是一个4叶片风扇,因此两侧都有类似的阴影。根据显示的代码,一旦刀片旋转180°并且看起来与起始位置相同,两个阴影现在位于风扇叶片的上方和左侧(参见屏幕截图),使其看起来好像光源也是与刀片一起旋转。这与刀片的单个图像包含静态阴影并旋转该图像没有什么不同。事实上,这正是发生的事情,阴影只在旋转开始前计算一次。我需要在运行中为每个帧重新制作阴影。