removeAllAnimations 不起作用后添加动画

Posted

技术标签:

【中文标题】removeAllAnimations 不起作用后添加动画【英文标题】:Add animation after removeAllAnimations doesn't work 【发布时间】:2017-08-29 12:26:11 【问题描述】:

我有一个简单的应用程序,即red 视图变换位置从左屏到右屏。我希望当我点击remove 按钮时,动画将重新启动(red 视图再次从左屏到右屏转换位置)但它不起作用。 red 视图返回到原始帧,但它没有移动,但 animationDidStop 在持续时间后仍被调用。

class TestViewController: UIViewController, CAAnimationDelegate 

let testView : UIView = 
    let view = UIView()
    view.translatesAutoresizingMaskIntoConstraints = false
    view.backgroundColor = .red
    view.layer.borderColor = UIColor.black.cgColor
    view.layer.cornerRadius = 5
    return view
()

let removeAniButton : UIButton = 
    let btn = UIButton(type: .system)
    btn.translatesAutoresizingMaskIntoConstraints = false
    btn.setTitle("Remove", for: .normal)
    return btn
()

let addAniButton : UIButton = 
    let btn = UIButton(type: .system)
    btn.translatesAutoresizingMaskIntoConstraints = false
    btn.setTitle("Add", for: .normal)
    return btn
()

override func viewDidLoad() 
    super.viewDidLoad()

    view.backgroundColor = .white

    view.addSubview(testView)
    testView.leftAnchor.constraint(equalTo: self.view.leftAnchor).isActive = true
    testView.centerYAnchor.constraint(equalTo: self.view.centerYAnchor).isActive = true
    testView.heightAnchor.constraint(equalToConstant: 100).isActive = true
    testView.widthAnchor.constraint(equalToConstant: 100).isActive = true

    view.addSubview(removeAniButton)
    removeAniButton.topAnchor.constraint(equalTo: self.view.topAnchor, constant: 50).isActive = true
    removeAniButton.centerXAnchor.constraint(equalTo: self.view.centerXAnchor).isActive = true
    removeAniButton.widthAnchor.constraint(equalToConstant: 100).isActive = true
    removeAniButton.heightAnchor.constraint(equalToConstant: 50).isActive = true
    removeAniButton.addTarget(self, action: #selector(removeAnimation), for: .touchUpInside)

    view.addSubview(addAniButton)
    addAniButton.topAnchor.constraint(equalTo: self.view.topAnchor, constant: 150).isActive = true
    addAniButton.centerXAnchor.constraint(equalTo: self.view.centerXAnchor).isActive = true
    addAniButton.widthAnchor.constraint(equalToConstant: 100).isActive = true
    addAniButton.heightAnchor.constraint(equalToConstant: 50).isActive = true
    addAniButton.addTarget(self, action: #selector(addAnimation), for: .touchUpInside)

    addAnimation()
    // Do any additional setup after loading the view.


func createAnimation() -> CAAnimation 
    let animation = CABasicAnimation(keyPath: "position.x")
    animation.fromValue = 0
    animation.toValue = self.view.frame.width
    animation.duration = 4
    animation.timingFunction = CAMediaTimingFunction.init(name: kCAMediaTimingFunctionLinear) 
    animation.fillMode = kCAFillModeForwards
    animation.isRemovedOnCompletion = false
    animation.delegate = self
    return animation


func removeAnimation()
    testView.layer.removeAllAnimations()
    testView.transform = .identity
    addAnimation()


func addAnimation()
    testView.layer.add(createAnimation(), forKey: nil)


func animationDidStop(_ anim: CAAnimation, finished flag: Bool) 
    if flag 
        print("Animation is finished")
    
  

谁能解释一下?

【问题讨论】:

您正在使用一个属性进行动画处理,而另一个属性用于返回其原始位置,这是您的问题 【参考方案1】:

您的问题是您为动画使用了错误的 keyPath,如果您想使用 testView.transform = .identity 重置动画,您需要使用 transform.translation.x 而不是“position.x”作为动画 keyPath,也不需要调用removeAllAnimations() 只需再次调用您的 addAnimation 即可完成工作

使用此代码创建动画

func createAnimation() -> CAAnimation 
    let animation = CABasicAnimation(keyPath: "transform.translation.x")
    animation.fromValue = 0
    animation.toValue = self.view.frame.width
    animation.duration = 4
    animation.timingFunction = CAMediaTimingFunction.init(name: kCAMediaTimingFunctionLinear)
    animation.fillMode = kCAFillModeForwards
    animation.isRemovedOnCompletion = false
    return animation


func removeAnimation()
    //customView.layer.removeAllAnimations()
    //customView.transform = .identity
    addAnimation()

【讨论】:

谢谢它的帮助,但我想知道为什么我不能调用 'customView.layer.removeAllAnimations()' 来删除动画?

以上是关于removeAllAnimations 不起作用后添加动画的主要内容,如果未能解决你的问题,请参考以下文章

removeAllAnimations 不适用于连续调用的动画

[layer removeAllAnimations] 调用时如何让动画视图停留在当前位置

线程 1:EXC_BREAKPOINT CALayer removeAllAnimations 消息发送到 deallocated

为啥通过动态链接导航后pushViewController 不起作用?

启用 Hystrix 后 Autowire 不起作用

为啥安装反应原生导航模块后应用程序不起作用?