Блок завершения CATransaction вызывается сразу после добавления анимации в подпредставление. - PullRequest
0 голосов
/ 09 марта 2019

Я пытаюсь запустить анимацию на недавно добавленном UIImageView как подпредставление, но кажется, что в этом случае блок завершения вызывается немедленно, даже если анимации добавляются после CATransaction.setCompletionBlock

addSubview(imageView)

CATransaction.begin()

let posAnimation = positionAnimation(startPoint: startPoint, endPoint: endPoint, beginTime: beginTime, duration: duration)
let alpAnimation = alphaAnimation(beginTime: beginTime, duration: duration)

CATransaction.setCompletionBlock{ [weak self] in
print("deleting view")
//imageView.removeFromSuperview()
}

imageView.layer.add(posAnimation, forKey: nil)
imageView.layer.add(alpAnimation, forKey: nil)

CATransaction.commit()

Анимация:

private func positionAnimation(startPoint: CGPoint, endPoint:CGPoint, beginTime: CFTimeInterval, duration: CFTimeInterval) -> CAKeyframeAnimation {
    let positionAnimation = CAKeyframeAnimation(keyPath: "position")

    positionAnimation.path = customPath(middlePoint: startPoint, endPoint: endPoint).cgPath
    positionAnimation.isRemovedOnCompletion = false
    positionAnimation.duration = duration
    positionAnimation.beginTime = beginTime
    positionAnimation.fillMode = CAMediaTimingFillMode.forwards
    return positionAnimation
}

private func alphaAnimation(beginTime: CFTimeInterval, duration: CFTimeInterval) -> CAKeyframeAnimation {
    let alphaAnimation = CAKeyframeAnimation(keyPath: "opacity")
    alphaAnimation.isRemovedOnCompletion = false
    alphaAnimation.fillMode = CAMediaTimingFillMode.forwards
    alphaAnimation.values = [1.0, 1.0, 0.0]
    alphaAnimation.keyTimes = [0.0,0.5,1.0]
    alphaAnimation.duration = duration
    alphaAnimation.beginTime = beginTime
    return alphaAnimation
}

Есть идеи, почему это не работает?

1 Ответ

0 голосов
/ 09 марта 2019

Очевидно, что анимация отсутствует в дереве рендеринга. то есть представление не имеет superView. или где-то его superView не имеет superView. Возможно, вам потребуется проверить, были ли функции, реализующие представление, добавлены к window или view где-либо.

...