animateWithDuration中的自定义简易性?

时间:2015-07-08 19:53:02

标签: 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))

我尝试制作自己的UIViewAnimationCurve,但它似乎只接受一个I​​nt。

我可以将自定义缓动应用于Core Animation,但我希望为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")
})

3 个答案:

答案 0 :(得分:4)

那是因为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()

答案 1 :(得分:0)

答案 2 :(得分:0)

经过大量研究,以下代码对我有用。

  1. 创建一个显式的核心动画事务,设置所需的计时功能。
  2. 使用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()