animateWithDuration 中的自定义缓动?
Custom ease in animateWithDuration?
在执行 UIView.animateWithDuration 时,我想定义一条自定义曲线以实现缓动,而不是默认曲线:.CurveEaseInOut、.CurveEaseIn、.CurveEaseOut、.CurveLinear。
这是我想要应用到 UIView.animateWithDuration 的示例缓动:
let ease = CAMediaTimingFunction(controlPoints: Float(0.8), Float(0.0), Float(0.2), Float(1.0))
我尝试制作自己的 UIViewAnimationCurve,但它似乎只接受一个 Int。
我可以将自定义缓动应用于核心动画,但我想为 UIView.animateWithDuration 自定义缓动以获得更简单和优化的代码。 UIView.animateWithDuration 对我来说更好,因为我不必为每个动画 属性 和更简单的完成处理程序定义动画,也不必将所有动画代码放在一个函数中。
到目前为止,这是我的非工作代码:
let customOptions = UIViewAnimationOptions(UInt((0 as NSNumber).integerValue << 50))
UIView.setAnimationCurve(UIViewAnimationCurve(rawValue: 5)!)
UIView.animateWithDuration(2, delay: 0, options: customOptions, animations: {
view.layer.position = toPosition
view.layer.bounds.size = toSize
}, completion: { finished in
println("completion")
})
那是因为 UIViewAnimationCurve 是一个枚举 - 它基本上是人类可读的整数值表示,用于确定要使用的曲线。
如果要定义自己的曲线,需要使用CA动画。
您仍然可以制作完成块和动画组。您可以将多个 CA 动画组合成一个 CAAnimationGroup
let theAnimations = CAAnimationGroup()
theAnimations.animations = [positionAnimation, someOtherAnimation]
要完成,请使用 CATransaction。
CATransaction.begin()
CATransaction.setCompletionBlock { () -> Void in
// something?
}
// your animations go here
CATransaction.commit()
对于 iOS 10.0,您可以使用 UIViewPropertyAnimator
。
https://developer.apple.com/documentation/uikit/uiviewpropertyanimator
经过大量研究,以下代码对我有用。
- 创建显式核心动画事务,设置所需的计时功能。
使用 UIKit 和 CAAnimation 中的一个或两者来执行更改。
let duration = 2.0
CATransaction.begin()
CATransaction.setAnimationDuration(duration)
CATransaction.setAnimationTimingFunction(CAMediaTimingFunction(controlPoints: 0.8, 0.0, 0.2, 1.0))
CATransaction.setCompletionBlock {
print("animation finished")
}
// View animation
UIView.animate(withDuration: duration) {
// E.g. view.center = toPosition
}
// Layer animation
view.layer.position = toPosition
view.layer.bounds.size = toSize
CATransaction.commit()
在执行 UIView.animateWithDuration 时,我想定义一条自定义曲线以实现缓动,而不是默认曲线:.CurveEaseInOut、.CurveEaseIn、.CurveEaseOut、.CurveLinear。
这是我想要应用到 UIView.animateWithDuration 的示例缓动:
let ease = CAMediaTimingFunction(controlPoints: Float(0.8), Float(0.0), Float(0.2), Float(1.0))
我尝试制作自己的 UIViewAnimationCurve,但它似乎只接受一个 Int。
我可以将自定义缓动应用于核心动画,但我想为 UIView.animateWithDuration 自定义缓动以获得更简单和优化的代码。 UIView.animateWithDuration 对我来说更好,因为我不必为每个动画 属性 和更简单的完成处理程序定义动画,也不必将所有动画代码放在一个函数中。
到目前为止,这是我的非工作代码:
let customOptions = UIViewAnimationOptions(UInt((0 as NSNumber).integerValue << 50))
UIView.setAnimationCurve(UIViewAnimationCurve(rawValue: 5)!)
UIView.animateWithDuration(2, delay: 0, options: customOptions, animations: {
view.layer.position = toPosition
view.layer.bounds.size = toSize
}, completion: { finished in
println("completion")
})
那是因为 UIViewAnimationCurve 是一个枚举 - 它基本上是人类可读的整数值表示,用于确定要使用的曲线。
如果要定义自己的曲线,需要使用CA动画。
您仍然可以制作完成块和动画组。您可以将多个 CA 动画组合成一个 CAAnimationGroup
let theAnimations = CAAnimationGroup()
theAnimations.animations = [positionAnimation, someOtherAnimation]
要完成,请使用 CATransaction。
CATransaction.begin()
CATransaction.setCompletionBlock { () -> Void in
// something?
}
// your animations go here
CATransaction.commit()
对于 iOS 10.0,您可以使用 UIViewPropertyAnimator
。
https://developer.apple.com/documentation/uikit/uiviewpropertyanimator
经过大量研究,以下代码对我有用。
- 创建显式核心动画事务,设置所需的计时功能。
使用 UIKit 和 CAAnimation 中的一个或两者来执行更改。
let duration = 2.0 CATransaction.begin() CATransaction.setAnimationDuration(duration) CATransaction.setAnimationTimingFunction(CAMediaTimingFunction(controlPoints: 0.8, 0.0, 0.2, 1.0)) CATransaction.setCompletionBlock { print("animation finished") } // View animation UIView.animate(withDuration: duration) { // E.g. view.center = toPosition } // Layer animation view.layer.position = toPosition view.layer.bounds.size = toSize CATransaction.commit()