CALayer Mask动画不会消失

时间:2018-05-27 06:30:10

标签: ios swift core-animation

我设置了一个像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

1 个答案:

答案 0 :(得分:1)

任何动画一样,当动画结束时,它将从渲染树中删除,并显示“真实”状态。您可以将动画图层的真实状态设置为 final 状态,这样当动画到达最终帧并被删除时,最终帧将被匹配图层的真实状态。

你不是那样做的。您可以将边界动画添加到遮罩层,但不要更改遮罩的实际边界。因此,当动画结束时,遮罩层似乎会跳回到初始边界 - 因为您从未更改它们。

至于“消失”部分,很难说出你的意思,但这可能是另一回事;我的代码中没有看到任何会使掩码“消失”的东西,所以我不清楚你的期望。如果你想在动画的 end 中发生新的事情,你需要附加一个完成函数。