【问题标题】:How do I delete CABasicAnimation and then restart it in Swift?如何删除 CABasicAnimation 然后在 Swift 中重新启动它?
【发布时间】:2021-10-26 12:40:51
【问题描述】:

我正在构建一个应用程序,该应用程序将在某个函数运行时显示动画,并在下一个函数运行时将其删除。但是,当它循环回来时,我需要它重新启动。

我已经能够将其从视图中删除

isHidden = true

但是如果我依靠它来恢复它,当它再次运行时,它会在第一个动画上叠加第二个动画,然后我取消隐藏它。

我也可以使用.removeFromSuperView()

让它消失,但我不知道如何让它回来。

以下是相关代码:

class ViewController: UIViewController {
// some code
let dots = UIImageView()

     override func viewDidLoad() {
        super.viewDidLoad()

// some code

dots.translatesAutoresizingMaskIntoConstraints = false
        dots.backgroundColor = .red
        dots.center = self.view.center
        

 view.addSubview(dots)

// Some Auto Layout code
}

func showAnimatingDotsInImageView(_ isOn: Bool) {
    let lay = CAReplicatorLayer()
    if isOn == true {
        lay.frame = CGRect(x: -55, y: 0, width: 30, height: 14) //yPos == 12
        let circle = CALayer()
        circle.frame = CGRect(x: 10, y: 10, width: 10, height: 10)
        circle.cornerRadius = circle.frame.width / 2
        circle.backgroundColor = rocketDark.cgColor//lightGray.cgColor //UIColor.black.cgColor
        lay.addSublayer(circle)
        lay.instanceCount = 5
        lay.instanceTransform = CATransform3DMakeTranslation(20, 0, 0)
        let anim = CABasicAnimation(keyPath: #keyPath(CALayer.opacity))
        anim.fromValue = 0.0
        anim.toValue = 1.0
        anim.duration = 2
        anim.repeatCount = .infinity
        circle.add(anim, forKey: "animation")
        lay.instanceDelay = anim.duration / Double(lay.instanceCount)
        dots.layer.addSublayer(lay)
    } else if isOn == false {
        //lay.removeFromSuperlayer()
        //lay.removeAllAnimations()
        dots.removeFromSuperview()
        //dots.stopAnimating()
    }
}

正如您可能知道的那样,我正在尝试编写howAnimatingDotsInImageView(false) 将其删除并howAnimatingDotsInImageView(true) 重新启动它的方法。

【问题讨论】:

  • 您从界面中删除了dots,但您再也不会将它添加到界面中。所以很明显你不能在这个视图中制作动画,因为没有视图。

标签: ios swift cabasicanimation careplicatorlayer


【解决方案1】:

我没有编译这段代码,但我认为使用这种方法可以删除你的动画

class ViewController: UIViewController {
// some code
let dots = UIImageView()
let circleLayer: CAlayer? // Save circle layer property

     override func viewDidLoad() {
        super.viewDidLoad()

// some code

dots.translatesAutoresizingMaskIntoConstraints = false
        dots.backgroundColor = .red
        dots.center = self.view.center
        

 view.addSubview(dots)

// Some Auto Layout code
}

func showAnimatingDotsInImageView(_ isOn: Bool) {
    let lay = CAReplicatorLayer()
    if isOn == true {
        lay.frame = CGRect(x: -55, y: 0, width: 30, height: 14) //yPos == 12
        circleLayer = CALayer()
        circleLayer?.frame = CGRect(x: 10, y: 10, width: 10, height: 10)
        circleLayer?.cornerRadius = circle?.frame.width / 2 ?? .zero
        circleLayer?.backgroundColor = rocketDark.cgColor//lightGray.cgColor //UIColor.black.cgColor
        circleLayer.map { lay.addSublayer($0) }
        lay.instanceCount = 5
        lay.instanceTransform = CATransform3DMakeTranslation(20, 0, 0)
        let anim = CABasicAnimation(keyPath: #keyPath(CALayer.opacity))
        anim.fromValue = 0.0
        anim.toValue = 1.0
        anim.duration = 2
        anim.repeatCount = .infinity
        circleLayer?.add(anim, forKey: "animation")
        lay.instanceDelay = anim.duration / Double(lay.instanceCount)
        dots.layer.addSublayer(lay)
    } else if isOn == false {
        circleLayer?.removeAnimation(forKey: "animation")
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-21
    • 1970-01-01
    • 2011-06-06
    • 1970-01-01
    相关资源
    最近更新 更多