Ios 自定义动画中的轻松时间?
在执行UIView.animateWithDuration时,我想定义一条自定义曲线以方便使用,而不是默认的:.CurveEaseInOut、.CurveEaseIn、.CurveEaseOut、.CurveLinear 这是我希望应用于UIView.animateWithDuration的示例:Ios 自定义动画中的轻松时间?,ios,swift,uiviewanimation,Ios,Swift,Uiviewanimation,在执行UIView.animateWithDuration时,我想定义一条自定义曲线以方便使用,而不是默认的:.CurveEaseInOut、.CurveEaseIn、.CurveEaseOut、.CurveLinear 这是我希望应用于UIView.animateWithDuration的示例: let ease = CAMediaTimingFunction(controlPoints: Float(0.8), Float(0.0), Float(0.2), Float(1.0)) 我尝试
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")
})
let customOptions=uiviewmanimationoptions(UInt((0作为NSNumber)。integerValue这是因为uiviewmanimationcurve是一个枚举-它基本上是人类可读的整数值表示形式,用于确定要使用的曲线
如果要定义自己的曲线,则需要使用CA动画
您仍然可以执行完成块和动画组。您可以将多个CA动画分组到CAAnimationGroup
let theAnimations = CAAnimationGroup()
theAnimations.animations = [positionAnimation, someOtherAnimation]
要完成,请使用CATTransaction
CATransaction.begin()
CATransaction.setCompletionBlock { () -> Void in
// something?
}
// your animations go here
CATransaction.commit()
在iOS 10.0中,您可以使用UIViewPropertyAnimator
请参见经过一系列研究,下面的代码对我很有用
创建显式核心动画事务,设置所需的计时功能
使用eigher或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()
看看这个问题。大部分答案都在objective-c中,但有一系列选项—关于计时功能的重要信息。这也有很大帮助:但是,这些都是CA动画(需要用于制作自定义曲线).OP想将这些曲线添加到UIView动画块中。到目前为止,我的答案似乎是否定的。您可以使用UIView.animateKeyframesWithDuration
完成类似的操作。这是一种不雅观的解决方法,但会起作用。但如果您的问题是“我可以将自己的计时功能应用到基于UIKit块的动画中吗?”,那么答案是否定的。Chris是对的。在animateWithDuration
系列中,您不能将自定义缓和曲线与UIView
动画方法一起使用。(至少在修改创建的动画的过程中需要一些技巧。)核心动画比UIView动画强大得多,使用起来也复杂得多。如果我有后续动画,最好将该动画放在setCompletionBlock中吗?如果是第三个动画,则该setCompletionBlock中的另一个动画?三步动画对我来说非常常见,每一步都有预期和超调。老实说,我会避免为类似的事情使用完成块,只是因为它凌乱而没有额外的好处。如果你知道动画的时间,我会说只需为每个动画设置适当的beginTime
。比如:myAnimation.beginTime=1
,就像邓肯说的,它更强大、更灵活e、 另外,如果你的应用程序中有一些常见的动画,你可以将它们设置在一个类别中,并具有短访问权限,如:myLayer.addAnimation(CABasicAnimation.addopacityanimation with duration(1),forKey:“opacity”)
啊,非常正确,beginTime非常适合。谢谢!关于setCompletionBlock,当动画完成后,当你想做非动画的事情时,它还方便吗?是的!你可以在那里做任何你想做的事情。也就是说,如果有很多事情要做,你可能应该把它包含在一个助手函数中,然后简单地调用i特别是当这些操作与数据操作有关时,最好将其与动画代码分离,以保持干净性和可读性,并尊重显示与数据的分离。