首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UIViewPropertyAnimator逆向动画

UIViewPropertyAnimator逆向动画
EN

Stack Overflow用户
提问于 2017-11-26 13:20:02
回答 2查看 7.7K关注 0票数 7

我有一个简单的脉冲动画,运行得很完美。

代码语言:javascript
复制
UIView.animate(withDuration: 1, animations: {
    myAnimatableView.transform = CGAffineTransform(scaleX: 1.2, y: 1.2)
}) { _ in
    UIView.animate(withDuration: 1, animations: {
        myAnimatableView.transform = .identity
    })
}

我想制作同样的动画,但现在用的是UIViewPropertyAnimator。是否有可能用新的API优雅地复制这种脉冲效应?

我就是这样做的

代码语言:javascript
复制
let animator = UIViewPropertyAnimator(duration: 1, curve: .linear) {
    animatableView.transform = CGAffineTransform(scaleX: 1.2, y: 1.2)
}
animator.addCompletion { _ in
    animator.isReversed = true
    animator.startAnimation()
}
animator.startAnimation()

但是我的animatableView被卡在1.2的比例上。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-28 10:24:03

似乎属性动画器在完成后删除动画(这将解释再次启动它将没有任何效果)-请参阅所以问题。基于此,您可以尝试通过pausesOnCompletion对其进行黑客攻击,但我希望这不会像您想象的那么容易。仅仅因为文档说:

当此属性的值为true时,动画处理程序在动画结束时仍处于活动状态,而则不执行其完成处理程序.

这意味着如果pauseOnCompletion设置为true,则不会调用完成处理程序。根据相同的文档,您可以通过观察动画器的isRunning属性来确定动画器何时结束(因此应该重新启动动画)。然而,当我尝试实现它时,我发现isRunning上的KVO在动画器的生命周期中没有被调用。因此,我最后的建议是简单地使用两个动画师,因为实现起来似乎容易得多:

代码语言:javascript
复制
let animator = UIViewPropertyAnimator(duration: 1, curve: .linear) {
    animatableView.transform = CGAffineTransform(scaleX: 1.2, y: 1.2)
}
animator.addCompletion { _ in
    let secondAnimator = UIViewPropertyAnimator(duration: 1, curve: .linear) {
        animatableView.transform = CGAffineTransform.identity
    }
    secondAnimator.startAnimation()
}
animator.startAnimation()
票数 8
EN

Stack Overflow用户

发布于 2017-11-26 14:03:33

我认为您的代码被这样翻译得更好

尝试使用此代码

代码语言:javascript
复制
    let animator = UIViewPropertyAnimator(duration: 1, curve: .linear) {
        self.animatableView.transform = CGAffineTransform(scaleX: 1.2, y: 1.2)
    }
    animator.addAnimations({
        self.animatableView.transform = CGAffineTransform.identity
    }, delayFactor: 0.5)
    animator.startAnimation()

或者您可以尝试使用UILayer动画。

尝试使用UILayer动画

代码语言:javascript
复制
let layerAnimation = CABasicAnimation(keyPath: "transform.scale")
layerAnimation.fromValue = 1
layerAnimation.toValue = 1.2
layerAnimation.isAdditive = false
layerAnimation.duration = CFTimeInterval(1)
layerAnimation.fillMode = kCAFillModeForwards
layerAnimation.isRemovedOnCompletion = true
layerAnimation.repeatCount = .infinity
layerAnimation.autoreverses = true

self.animatableView.layer.add(layerAnimation, forKey: "growingAnimation")
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47496584

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档