如何在 Swift 中制作动画 shadowOffset?
How to make an animation shadowOffset in Swift?
我写了代码,但我不明白为什么它不起作用...
func animate(vc: UIView) {
vc.layer.shadowColor = #colorLiteral(red: 0.9254902005, green: 0.2352941185, blue: 0.1019607857, alpha: 1)
vc.layer.shadowRadius = 5
vc.layer.shadowOffset = CGSize(width: 0, height: 0)
let animationX = CABasicAnimation()
animationX.keyPath = "shadowOffset"
animationX.fromValue = vc.layer.shadowOffset
animationX.toValue = CGSize(width: 10, height: 10)
animationX.duration = 1
vc.layer.add(animationX, forKey: animationX.keyPath)
}
@IBAction func buttonTapped(_ sender: UIButton) {
animate(vc: sender)
}
有人知道这是怎么回事吗?
缺少一些东西
- 阴影路径
- 阴影不透明度
vc.layer.masksToBounds = false
vc.layer.shadowColor = #colorLiteral(red: 0.9254902005, green: 0.2352941185, blue: 0.1019607857, alpha: 1)
vc.layer.shadowRadius = 5
vc.layer.shadowOffset = CGSize(width: 0, height: 0)
vc.layer.shadowPath = UIBezierPath(rect: vc.bounds).cgPath
vc.layer.shadowOpacity = 1.0
let animationX = CABasicAnimation()
animationX.keyPath = "shadowOffset"
animationX.fromValue = vc.layer.shadowOffset
animationX.toValue = CGSize(width: 10, height: 10)
animationX.duration = 1
vc.layer.add(animationX, forKey: animationX.keyPath)
默认情况下 shadowOpacity
为 0。
决赛O/P
编辑:
如果您希望阴影在动画结束后仍保留在其位置,请指定
- 填充模式
- isRemovedOnCompletion
最终代码看起来像
func animate(vc: UIView) {
vc.layer.masksToBounds = false
vc.layer.shadowColor = #colorLiteral(red: 0.9254902005, green: 0.2352941185, blue: 0.1019607857, alpha: 1)
vc.layer.shadowRadius = 5
vc.layer.shadowOffset = CGSize(width: 0, height: 0)
vc.layer.shadowPath = UIBezierPath(rect: vc.bounds).cgPath
vc.layer.shadowOpacity = 1.0
let animationX = CABasicAnimation()
animationX.keyPath = "shadowOffset"
animationX.fromValue = vc.layer.shadowOffset
animationX.toValue = CGSize(width: 10, height: 10)
animationX.duration = 1
animationX.fillMode = .forwards
animationX.isRemovedOnCompletion = false
vc.layer.add(animationX, forKey: animationX.keyPath)
}
最终 O/P 看起来像:
我写了代码,但我不明白为什么它不起作用...
func animate(vc: UIView) {
vc.layer.shadowColor = #colorLiteral(red: 0.9254902005, green: 0.2352941185, blue: 0.1019607857, alpha: 1)
vc.layer.shadowRadius = 5
vc.layer.shadowOffset = CGSize(width: 0, height: 0)
let animationX = CABasicAnimation()
animationX.keyPath = "shadowOffset"
animationX.fromValue = vc.layer.shadowOffset
animationX.toValue = CGSize(width: 10, height: 10)
animationX.duration = 1
vc.layer.add(animationX, forKey: animationX.keyPath)
}
@IBAction func buttonTapped(_ sender: UIButton) {
animate(vc: sender)
}
有人知道这是怎么回事吗?
缺少一些东西
- 阴影路径
- 阴影不透明度
vc.layer.masksToBounds = false
vc.layer.shadowColor = #colorLiteral(red: 0.9254902005, green: 0.2352941185, blue: 0.1019607857, alpha: 1)
vc.layer.shadowRadius = 5
vc.layer.shadowOffset = CGSize(width: 0, height: 0)
vc.layer.shadowPath = UIBezierPath(rect: vc.bounds).cgPath
vc.layer.shadowOpacity = 1.0
let animationX = CABasicAnimation()
animationX.keyPath = "shadowOffset"
animationX.fromValue = vc.layer.shadowOffset
animationX.toValue = CGSize(width: 10, height: 10)
animationX.duration = 1
vc.layer.add(animationX, forKey: animationX.keyPath)
默认情况下 shadowOpacity
为 0。
决赛O/P
编辑:
如果您希望阴影在动画结束后仍保留在其位置,请指定
- 填充模式
- isRemovedOnCompletion
最终代码看起来像
func animate(vc: UIView) {
vc.layer.masksToBounds = false
vc.layer.shadowColor = #colorLiteral(red: 0.9254902005, green: 0.2352941185, blue: 0.1019607857, alpha: 1)
vc.layer.shadowRadius = 5
vc.layer.shadowOffset = CGSize(width: 0, height: 0)
vc.layer.shadowPath = UIBezierPath(rect: vc.bounds).cgPath
vc.layer.shadowOpacity = 1.0
let animationX = CABasicAnimation()
animationX.keyPath = "shadowOffset"
animationX.fromValue = vc.layer.shadowOffset
animationX.toValue = CGSize(width: 10, height: 10)
animationX.duration = 1
animationX.fillMode = .forwards
animationX.isRemovedOnCompletion = false
vc.layer.add(animationX, forKey: animationX.keyPath)
}
最终 O/P 看起来像: