如何从UIView中删除CAShapeLayer和CABasicAnimation?

时间:2018-03-27 17:22:34

标签: swift swift-playground cashapelayer cabasicanimation cgpath

这是我的代码:

add_filter( 'body_class', function( $classes ) {
if ( is_category( 'x cateorgy' ) ) 
{ 
    foreach($classes as $key => $class) {
        if( $class == "colors-custom" )
    {
                unset($classes[$key]);
        }
    }
}
$classes[] = 'colors-dark';
return $classes;
}, 1000);

此代码为shapeLayer路径的绘制设置动画,但是我无法在线找到有关删除此图层和停止此基本动画或删除绘制的cgPath的任何内容...将非常感谢任何帮助!< / p>

2 个答案:

答案 0 :(得分:6)

你说:

  

我在网上找不到任何关于删除此图层的信息......

removeFromSuperlayer()

shapeLayer.removeFromSuperlayer()

你继续说:

  

...并停止这个基本动画...

removeAllAnimations

shapeLayer.removeAllAnimations()

注意,这会立即将strokeEnd(或您动画的任何属性)更改回其先前的值。如果你想在你停止它的地方“冻结”它,你必须抓住presentation图层(它捕捉图层的属性,因为它们是动画中期),保存适当的属性,然后更新属性停止动画的图层:

if let strokeEnd = shapeLayer.presentation()?.strokeEnd {
    shapeLayer.removeAllAnimations()
    shapeLayer.strokeEnd = strokeEnd
}

最后,你继续说:

  

...或删除被绘制的cgPath

只需将其设为nil

shapeLayer.path = nil

顺便说一下,当您浏览CAShapeLayerCABasicAnimation的文档时,请不要忘记查看其超类的文档,即CALayer和{分别为{3}}»CAAnimation。最重要的是,当围绕寻找某些特定类的属性或方法的文档时,您经常需要深入研究超类以查找相关信息。

最后,CAPropertyAnimation是很好的介绍,虽然它的例子在Objective-C中,但所有概念都适用于Swift。

答案 1 :(得分:1)

动画开始或结束时,您可以使用动画委托CAAnimationDelegate执行其他逻辑。例如,您可能希望在淡出动画完成后从其父级中删除图层。

下面的代码来自在图层上实现CAAnimationDelegate的类,当您调用fadeOut函数时,动画化该图层的不透明度,一旦动画完成,animationDidStop(_:finished:)将其从超级图层中删除

extension CALayer : CAAnimationDelegate  {
    func fadeOut() {
        let fadeOutAnimation = CABasicAnimation()
        fadeOutAnimation.keyPath = "opacity"
        fadeOutAnimation.fromValue = 1
        fadeOutAnimation.toValue = 0
        fadeOutAnimation.duration = 0.25
        fadeOutAnimation.delegate = self
        self.add(fadeOutAnimation,
                     forKey: "fade")
    }

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