CALayer Mask Animation не исчезает - PullRequest
0 голосов
/ 27 мая 2018

Я настроил заставку, как при открытии твиттеров, и он работает нормально, но как только анимация завершена, маска возвращается в нормальное состояние и не исчезает после расширения.Вот код для маски и анимации:

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")        
    }
}

изображение того, к чему возвращается маска после завершения анимации вместо исчезновения

1 Ответ

0 голосов
/ 27 мая 2018

Как и в случае любой анимации, когда анимация заканчивается, она удаляется из дерева рендеринга и раскрывается "истинное" состояние дел.Вы должны установить истинное состояние анимированного слоя в его окончательное состояние, чтобы, когда анимация достигла своего последнего кадра и была удалена, этот последний кадр соответствовал уровню слоя.истинное состояние.

Вы этого не делаете.Вы добавляете анимацию границ в слой маски, но не изменяете real границ маски.Поэтому, когда анимация заканчивается, слой маски, кажется, возвращается к своим начальным границам - потому что вы никогда не меняли их.

Что касается части "исчезнуть", то трудно сказать, что вызначит, но это, вероятно, другое дело;Я не вижу в вашем коде ничего, что могло бы заставить маску «исчезнуть», поэтому я не совсем понимаю, чего вы ожидаете.Если вы хотите, чтобы что-то новое произошло в конце анимации, вам нужно прикрепить к нему функцию завершения.

...