微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ios – UIViewPropertyAnimator反向动画

我有一个完美运行的简单脉冲动画

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优雅地复制此脉冲效果

我是这样做的

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()

但我的动画视图只是缩放到1.2.

解决方法

似乎属性动画师在完成后删除了动画(这可以解释再次启动动画会没有效果) – 请参阅 SO question.基于此,您可以尝试通过pausesOnCompletion进行攻击,但我希望这不会那么容易你可能会想到的.仅仅因为 documentation说:

When the value of this property is true,the animator remains in the active state when the animation finishes,and it does not execute its completion handler.

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

let animator = UIViewPropertyAnimator(duration: 1,y: 1.2)
}
animator.addCompletion { _ in
    let secondAnimator = UIViewPropertyAnimator(duration: 1,curve: .linear) {
        animatableView.transform = CGAffineTransform.identity
    }
    secondAnimator.startAnimation()
}
animator.startAnimation()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐