gpt4 book ai didi

iphone - 如何在动画完成时删除图层?

转载 作者:可可西里 更新时间:2023-11-01 05:30:13 34 4
gpt4 key购买 nike

我正在制作一个 iOS 应用。我有几个 CALayer 对象,它们最终将被(缩小的)动画 删除。当动画完成并调用 animationDidStop:finished 时,我想从 super viewremove CALayer 对象/em> 并将其删除。

  1. 但是我怎样才能得到 CALayer 对象animationDidStop:finished?我会猜到CAanimation - 对象有一个指向层的指针,但我找不到它在文档中。
  2. 有没有更好的方法来处理这个问题? (实际上,我有几个动画对象添加到同一层,理想情况下,我想只在最后一个动画完成时删除该层)

最佳答案

自从回答这个问题以来已经有很长时间了,但是我会尝试添加一个更快速的解决方案,以防现在有人仍在寻找更干净的解决方案。

如果您感兴趣的只是在 CAAnimation 完成后立即删除图层,您可以将动画的委托(delegate)分配给一个简单的 NSObject,它包含对目标图层的引用并等待动画回调以便驳回它。

我们将此辅助对象称为 LayerRemover:

class LayerRemover: NSObject, CAAnimationDelegate {
private weak var layer: CALayer?

init(for layer: CALayer) {
self.layer = layer
super.init()
}

func animationDidStop(_ anim: CAAnimation, finished flag: Bool) {
layer?.removeFromSuperlayer()
}
}

这个对象所做的一切都是通过初始化器接收 CALayer 引用并在移除层之前等待 animationDidStop 回调。此时,一旦通过委托(delegate)属性保留它的 CAAnimation 被取消初始化,Layer remover 也会被清除。

现在,您所要做的就是实例化并使用该去除剂:

let layer = CAShapeLayer()
layer.path = UIBezierPath(ovalIn: CGRect(x: 0, y: 0, width: 200, height: 100)).cgPath
let myAnimation = CABasicAnimation(keyPath: "strokeEnd")
...
myAnimation.delegate = LayerRemover(for: layer)

就是这样!

请注意,自从 Apple documentation 以来,您不必保留对 LayerRemover 对象的任何引用。我们可以读到

The delegate object is retained by the receiver. This is a rare exception to the memory management rules described in Advanced Memory Management Programming Guide.

关于iphone - 如何在动画完成时删除图层?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17688440/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com