如何从UIView中移除CAShapeLayer与CABasicAnimation?
如何从UIView中移除CAShapeLayer和CABasicAnimation?
嘿,我来帮你搞定这个问题!要从UIView里移除CAShapeLayer和它绑定的CABasicAnimation其实挺直接的,分两步走就行:
一、移除CAShapeLayer
CAShapeLayer属于CALayer的子类,移除它的方式和普通图层一样:
- 如果你已经持有这个
shapeLayer的引用(从你的代码来看,你应该已经定义了这个实例变量),直接调用下面的方法就能把它从父图层里移除:shapeLayer.removeFromSuperlayer() - 要是你没有直接的引用,也可以给shapeLayer设置一个
name标记,之后通过遍历父图层的子图层来找到它:// 添加shapeLayer时设置name shapeLayer.name = "MyCustomShapeLayer" // 移除时查找并删除 if let sublayers = yourView.layer.sublayers { for layer in sublayers { if layer.name == "MyCustomShapeLayer" { layer.removeFromSuperlayer() break } } }
二、移除CABasicAnimation
动画是绑定在layer上的,移除方式取决于你添加动画时是否指定了key:
- 如果你添加动画时指定了唯一的key(比如下面这样):
那移除时就用这个key精准删除:let strokeAnimation = CABasicAnimation(keyPath: "strokeEnd") // 配置动画的时长、起始值等参数 shapeLayer.add(strokeAnimation, forKey: "StrokeAnimation")shapeLayer.removeAnimation(forKey: "StrokeAnimation") - 要是你没指定key,或者想一次性清空这个layer上的所有动画,直接调用:
shapeLayer.removeAllAnimations()
结合你的代码的小建议
从你给出的drawForm方法来看,每次调用这个方法可能都会创建新的路径和动画,建议你在开始新的绘制前,先清理掉旧的图层和动画,避免重复叠加导致的性能问题或者显示异常:
@objc func drawForm() { // 先清理旧的动画和图层 shapeLayer.removeAllAnimations() shapeLayer.removeFromSuperlayer() // 继续你的绘制逻辑 i = Int(arc4random_uniform(UInt32(formNames.count))) var drawPath = actualFormNamesFromFormClass[i] shapeLayer.fillColor = UIColor.clear.cgColor shapeLayer.strokeColor = UIColor.black.cgColor shapeLayer.lineWidth = 6 shapeLayer.frame = CGRect(x: -115, y: 280, width: 350, height: 350) var paths: [UIBezierPath] = drawPath() let shapeBounds = shapeLayer.bounds let mirror = CGAffineTransform(scaleX: 1, y: -1) let translate = CGAffineTransform(translationX: 0, y: shapeBounds.height) // ... 剩下的绘制代码 }
内容的提问来源于stack exchange,提问作者Thijs van der Heijden
相关产品推荐
相关产品推荐

