我设置了一个像twitters打开的启动屏幕,它运行正常,但一旦动画完成,屏幕恢复正常,并且在加宽后不会消失。这是面具和代码的代码。动画:
override func viewDidLoad() {
super.viewDidLoad()
//setting up the arm mask
imageView.image = UIImage(named: "placeholderbg.png")
self.mask = CALayer()
self.mask?.contents = UIImage(named: "arm.png")?.cgImage
self.mask?.bounds = CGRect(x: 0, y: 0, width: 120, height: 100)
self.mask?.anchorPoint = CGPoint(x: 0.5, y: 0.5)
self.mask?.position = CGPoint(x: view.frame.size.width/2, y: view.frame.size.height/2)
imageView.layer.mask = mask
//animation of the mask
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(2)) {
let keyFrameAnimation = CAKeyframeAnimation(keyPath: "bounds")
keyFrameAnimation.duration = 1
keyFrameAnimation.timingFunctions =
[CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut),
CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)]
let initialBounds = NSValue(cgRect: self.mask!.bounds)
let secondBounds = NSValue(cgRect: CGRect(x: 0, y: 0, width: 110, height: 90))
let finalBounds = NSValue(cgRect: CGRect(x: 0, y: 0, width: 6000, height: 5000))
keyFrameAnimation.values = [initialBounds, secondBounds, finalBounds]
keyFrameAnimation.keyTimes = [0, 0.3, 1]
self.mask!.add(keyFrameAnimation, forKey: "bounds")
}
}
image of what the mask returns to after animation is complete instead of disappearing
答案 0 :(得分:1)
与任何动画一样,当动画结束时,它将从渲染树中删除,并显示“真实”状态。您可以将动画图层的真实状态设置为 final 状态,这样当动画到达其最终帧并被删除时,最终帧将被匹配图层的真实状态。
你不是那样做的。您可以将边界动画添加到遮罩层,但不要更改遮罩的实际边界。因此,当动画结束时,遮罩层似乎会跳回到初始边界 - 因为您从未更改它们。
至于“消失”部分,很难说出你的意思,但这可能是另一回事;我的代码中没有看到任何会使掩码“消失”的东西,所以我不清楚你的期望。如果你想在动画的 end 中发生新的事情,你需要附加一个完成函数。