Ios 如何使用CFTimeInterval指定动画的起始时间?

Ios 如何使用CFTimeInterval指定动画的起始时间?,ios,iphone,cocoa-touch,uikit,core-animation,Ios,Iphone,Cocoa Touch,Uikit,Core Animation,根据我的理解,beginTime可以用来表示“嘿,12点准时开始”。但是对于CFTimeInterval类型,我该怎么说呢?我认为这只不过是一种用于指定秒数的“浮点”值 或者CAMediaTiming协议中指定的timeOffset属性还有什么不同呢?不,这不是beginTime所做的。它指定从其父动画开始的相对开始时间(默认情况下,组中的多个动画一次全部触发) 从: 指定事件的开始时间 接管人与其母公司的关系 对象,如果适用 时间偏移使其在偏移时间的帧处开始设置动画,并在到达终点时循环。换句话

根据我的理解,beginTime可以用来表示“嘿,12点准时开始”。但是对于CFTimeInterval类型,我该怎么说呢?我认为这只不过是一种用于指定秒数的“浮点”值


或者CAMediaTiming协议中指定的timeOffset属性还有什么不同呢?

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

从:

指定事件的开始时间 接管人与其母公司的关系 对象,如果适用

时间偏移使其在偏移时间的帧处开始设置动画,并在到达终点时循环。换句话说,假设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

我在文档中遗漏的是:beginTime在“核心动画绝对时间”中,因此您必须获取当前时间并指定偏移量:

// Start in 5 seconds
theAnimation.beginTime = CACurrentMediaTime() + 5;

我认为Cameditaiming协议的文档非常糟糕。是对CAMediaTiming协议所有属性的彻底解释(重新文档化)。

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

然后,您可以相对于图层的“现在”时间设置
beginTime
。例如,要使动画在2秒内开始,请执行以下操作:

myAnimation.beginTime = currentLayerTime + 2
您可能还希望将
fillMode
设置为
.backwards
,以便在添加动画之前设置最终属性值:

myAnimation.fillMode = .backwards
myLayer.someProperty = someFinalValue
myLayer.addAnimation(myAnimation, forKey: "myAnimationName")

仅设置timeOffset不会延迟动画并更改初始时间。你的“timeOffset”行实际上就是你设置的“timeOffset”和“beginTime”……对吗?路易斯,你知道有没有办法只运行一个动画,比如:Partial:|-a->B->C,因此,基本上与您提到的beginTime案例相同,但在它结束时让它停止,而不是让它循环?就像魅力@Louisgerberg一样。ThanksbeginTime是在父时间空间中指定的,而不是相对于绝对时间。@an0,显然,在我的例子中,父时间空间与CACurrentMediaTime()相同,因此它工作正常。如何引用父时间空间?我们应该使用层时间空间中的当前时间-直接添加到层的动画的父时间空间-作为基础。如果层的起始时间设置为非零,则代码将无法工作。详情见我的答案。
myAnimation.fillMode = .backwards
myLayer.someProperty = someFinalValue
myLayer.addAnimation(myAnimation, forKey: "myAnimationName")