更改片段后,请停止旧动画并开始新动画,然后迅速

时间:2019-02-08 18:23:17

标签: swift core-animation

当我切换段控件时,是否存在可以停止上一个动画的方法或函数? 如果我不删除动画,则在第一段上淡出的图像会在第二段上开始旋转,然后在第三段上移动。 当我切换片段时,它的工作方式就像一直在附加不同的动画。

我尝试过: -removeAllAnimations(),但无法正常工作。 -self.view.layer.removeAnimation(forKey:“ moveAnimation”)。在每个段选择的代码末尾尝试了一个。

也许我没有把它放在正确的位置,但是我不能使其正常工作

这是我的代码:

import UIKit

class MoveViewController: UIViewController {


    @IBOutlet var sgAction : UISegmentedControl!

    var moveLayer : CALayer?

    @IBAction func segmentDidChange(sender : UISegmentedControl){
        updateAction()

    }


    func updateAction(){
        let action = sgAction.selectedSegmentIndex

        if action == 0 {
            //fade

            let fadeAnimation = CABasicAnimation(keyPath: "opacity")

            self.view.layer.removeAnimation(forKey: "fadeAnimation")

            fadeAnimation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeInEaseOut)
            fadeAnimation.fromValue = NSNumber.init(value: 1.0)
            fadeAnimation.toValue = NSNumber.init(value: 0.0)
            fadeAnimation.isRemovedOnCompletion = false

            fadeAnimation.duration = 3.0
            fadeAnimation.beginTime = 1.0
            fadeAnimation.isAdditive = false
            fadeAnimation.fillMode = CAMediaTimingFillMode.both
            fadeAnimation.repeatCount = Float.infinity
            moveLayer?.add(fadeAnimation, forKey: nil)

        } else if action == 1 {
            //2. rotate

            let rotateAnimation = CABasicAnimation(keyPath: "transform.rotation")

            self.view.layer.removeAnimation(forKey: "rotateAnimation")

            rotateAnimation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeInEaseOut)
            rotateAnimation.fromValue = 0
            rotateAnimation.toValue = 2 * Double.pi

            rotateAnimation.isRemovedOnCompletion = false

            rotateAnimation.duration = 1.0
            rotateAnimation.repeatCount = Float.infinity
            moveLayer?.add(rotateAnimation, forKey:nil)


        } else {
            //3. move

            let moveAnimation = CABasicAnimation(keyPath: "position")
            self.view.layer.removeAnimation(forKey: "moveAnimation")

            moveAnimation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeInEaseOut)

            moveAnimation.fromValue = NSValue.init(cgPoint: CGPoint(x: 0, y: 0))
            moveAnimation.toValue = NSValue.init(cgPoint: CGPoint(x: 700, y: 500))
            moveAnimation.isRemovedOnCompletion = false
            moveAnimation.duration = 3.0
            moveAnimation.repeatCount = Float.infinity
            moveLayer?.add(moveAnimation, forKey: nil)

        }
    }
//        moveLayer?.removeAllAnimations()




    func createImg(){
        let displayImage = UIImage(named: "balloon.png")
        moveLayer = CALayer.init()
        moveLayer?.contents = displayImage?.cgImage
        moveLayer?.bounds = CGRect(x: 0, y: 0, width: 150, height: 150)
        moveLayer?.position = CGPoint(x: 300, y: 200)
        self.view.layer.addSublayer(moveLayer!)
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        createImg()
//      moveLayer?.removeAllAnimations()
        updateAction()

    }

}

1 个答案:

答案 0 :(得分:1)

moveLayer?.removeAllAnimations()self.moveLayer.layoutIfNeed()添加到segmentDidChange(sender : UISegmentedControl)时。另外,需要更改的另一个关键项是从moveLayer?.add(fadeAnimation, forKey: "nil")moveLayer?.add(fadeAnimation, forKey: "fadeAnimation")

import UIKit

class MoveViewController: UIViewController {

    @IBOutlet var sgAction : UISegmentedControl!

    var moveLayer : CALayer?

    override func viewDidLoad() {
        super.viewDidLoad()
        createImg()
        updateAction()
    }

    @IBAction func segmentDidChange(sender : UISegmentedControl){
        moveLayer?.removeAllAnimations()
        self.moveLayer?.layoutIfNeeded()
        updateAction()
    }

    func updateAction(){
        switch sgAction.selectedSegmentIndex {
        case 0:
            //fade
            let fadeAnimation = CABasicAnimation(keyPath: "opacity")

            fadeAnimation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeInEaseOut)
            fadeAnimation.fromValue = NSNumber.init(value: 1.0)
            fadeAnimation.toValue = NSNumber.init(value: 0.0)
            fadeAnimation.isRemovedOnCompletion = false

            fadeAnimation.duration = 3.0
            fadeAnimation.beginTime = 1.0
            fadeAnimation.isAdditive = false
            fadeAnimation.fillMode = CAMediaTimingFillMode.both
            fadeAnimation.repeatCount = Float.infinity
            moveLayer?.add(fadeAnimation, forKey: "fadeAnimation")

        case 1:
            //2. rotate
            let rotateAnimation = CABasicAnimation(keyPath: "transform.rotation")

            rotateAnimation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeInEaseOut)
            rotateAnimation.fromValue = 0
            rotateAnimation.toValue = 2 * Double.pi

            rotateAnimation.isRemovedOnCompletion = false

            rotateAnimation.duration = 1.0
            rotateAnimation.repeatCount = Float.infinity
            moveLayer?.add(rotateAnimation, forKey: "rotateAnimation")

        case 2:
            //3. move
            let moveAnimation = CABasicAnimation(keyPath: "position")

            moveAnimation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeInEaseOut)

            moveAnimation.fromValue = NSValue.init(cgPoint: CGPoint(x: 0, y: 0))
            moveAnimation.toValue = NSValue.init(cgPoint: CGPoint(x: 700, y: 500))
            moveAnimation.isRemovedOnCompletion = false
            moveAnimation.duration = 3.0
            moveAnimation.repeatCount = Float.infinity
            moveLayer?.add(moveAnimation, forKey: "position")
        default: break

        }
    }

    func createImg(){
        let displayImage = UIImage(named: "balloon.png")
        moveLayer = CALayer.init()
        moveLayer?.contents = displayImage?.cgImage
        moveLayer?.bounds = CGRect(x: 0, y: 0, width: 150, height: 150)
        moveLayer?.position = CGPoint(x: 300, y: 200)
        self.view.layer.addSublayer(moveLayer!)
    }

}