0

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

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

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)重新启动它。

4

1 回答 1

-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")
    }
}
于 2021-10-26T13:35:04.570 回答