Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 自定义动画中的轻松时间?_Ios_Swift_Uiviewanimation - Fatal编程技术网

Ios 自定义动画中的轻松时间?

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)) 我尝试

在执行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")
})

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特别是当这些操作与数据操作有关时,最好将其与动画代码分离,以保持干净性和可读性,并尊重显示与数据的分离。