我正在编写一个函数来定义屏幕上突出显示区域的位置和大小,并在用户点击教程时动画更改区域。具体来说,整个屏幕都是灰色的,除了这个区域,该区域由下面函数中引用的corners()
函数定义。 corners()
函数正常工作,但下面的函数不允许子层/路径在每次执行函数后永久更改为新位置。换句话说,每次调用该函数时,动画的开始就是屏幕上路径的原始位置。
func prepareForEditing(editing:Bool) {
let animation = CABasicAnimation(keyPath: "path")
animation.duration = 0.3
//the corners() function sets the sublayer, including the sublayer's path
//let lastShape = corners(frame: TutorialModal.tutorialRects[tutorialItem - 2])
let newShape = corners(frame: TutorialModal.tutorialRects[tutorialItem - 1])
animation.fromValue = (dimScreen.layer.sublayers?[0] as! CAShapeLayer).path
animation.toValue = newShape.path
animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut)
animation.fillMode = kCAFillModeForwards
animation.isRemovedOnCompletion = false
animation.autoreverses = false
dimScreen.layer.sublayers?[0].add(animation, forKey: nil)
}
我最初使用lastShape
为切口设置动画,然而,这导致动画的持续时间被忽略(即,即时更新剪切而不是在屏幕上为其设置动画)。我更新了动画的fromValue特性以使用实际的当前子图层路径(来自dimScreen
视图),现在我遇到了上述问题。
我还尝试在动画后完全删除并替换dimScreen
子图层,但在重新应用路径之前清除整个屏幕,这不是我正在寻找的。