如何使用CFTimeInterval为动画指定beginTime?

Tha*_*nks 27 iphone cocoa-touch core-animation uikit ios

根据我的理解,beginTime可以用来表示"嘿,从正好在12:00开始".但是我怎么用CFTimeInterval类型告诉它?我认为这只是一种指定秒的"浮动"值.

或者还有什么与CAMediaTiming协议中指定的timeOffset属性的区别?

Ort*_*ntz 54

我在文档中遗漏的内容:beginTime在"核心动画绝对时间"中,因此您需要获取当前时间并指定您的偏移量:

// Start in 5 seconds
theAnimation.beginTime = CACurrentMediaTime()+5;
Run Code Online (Sandbox Code Playgroud)

  • beginTime在父时空中指定,而不是相对于绝对时间. (4认同)

Chr*_*ris 19

您首先需要转换为图层的时空,如下所示:

let currentLayerTime = myLayer.convertTime(CACurrentMediaTime(), from: nil)
Run Code Online (Sandbox Code Playgroud)

然后您可以设置beginTime图层现在时间的相对值.例如,要以2s开始制作动画:

myAnimation.beginTime = currentLayerTime + 2
Run Code Online (Sandbox Code Playgroud)

您还可能希望将to设置fillMode.backwards,以便在添加动画之前设置最终属性值:

myAnimation.fillMode = .backwards
myLayer.someProperty = someFinalValue
myLayer.addAnimation(myAnimation, forKey: "myAnimationName")
Run Code Online (Sandbox Code Playgroud)


Lou*_*arg 13

不,这不是beginTime的作用.它从父动画中指定相对开始时间(默认情况下,组中的多个动画一次全部触发).

文档:

指定接收器相对于其父对象的开始时间(如果适用).

timeOffset使它开始在offSet时的帧处开始动画,当它到达结尾时它会循环.换句话说,想象A,B,C,D,E是动画帧,如果将beginTime或timeOffset设置为等于正常情况下的帧C时的值,则会出现各种情况.

Normal      |A->B->C->D->E
beginTime:  |      A->B->C->D->E
timeOffset: |C->D->E->A->B
Run Code Online (Sandbox Code Playgroud)

  • 路易斯,你知道是否有办法像以下那样运行动画:Partial:| - - A-> B-> C,所以基本上与你提到的beginTime案例相同,但是当它到达终点而不是让它循环时它会停止? (4认同)

an0*_*an0 12

我认为CAMediaTiming Protocol的文档非常糟糕.动画中的时间扭曲是对CAMediaTiming协议的所有属性的彻底解释(重新记录).