gpt4 book ai didi

ios - 使用延迟动画暂停 CALayer 动画

转载 作者:可可西里 更新时间:2023-11-01 03:21:50 25 4
gpt4 key购买 nike

我有一组嵌套的 UIView 动画(在给定时间有 2 或 3 层深)我希望能够暂停和恢复。其中一些动画使用 -animateWithDuration:animations:completion: 而其他动画使用 -animateWithDuration:delay:options:animations:completion: 以延迟动画 block 的执行。

我阅读并实现了 Technical Q&A QA1673关于暂停层树中的所有动画,但我遇到了使用延迟参数的动画的问题。我可以很好地暂停和恢复动画,但是当动画恢复时,任何具有与之关联的延迟的动画 block 似乎都将其延迟延长了图层树暂停的时间量。因此,例如,如果其中一个 block 有 1 秒的延迟,并且图层树暂停了 3 秒,则动画在恢复后延迟 4 秒。我猜这与 beginTime 属性有关?任何帮助将不胜感激。

// Pause and Resume methods, right from the technical Q&A
- (void)pauseAnimationsOnLayer:(CALayer *)layer
{
CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil];
layer.speed = 0.0;
layer.timeOffset = pausedTime;
}

- (void)resumeAnimationsOnLayer:(CALayer *)layer
{
CFTimeInterval pausedTime = [layer timeOffset];
layer.speed = 1.0;
layer.timeOffset = 0.0;
layer.beginTime = 0;
CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime;
layer.beginTime = timeSincePause;
}

// Chained animations
- (void)animateNextPopup
{
[UIView animateWithDuration:kRFPVictorySequenceStatePopupDuration
animations:^{
[_currentStateImageView setHidden:NO];
[_currentStateImageView setTransform:CGAffineTransformIdentity];

}
completion:^(BOOL finished) {
[UIView animateWithDuration:kRFPVictorySequenceStateSlideOffDuration
delay:kRFPVictorySequenceStateVoteDelay
options:UIViewAnimationOptionCurveEaseInOut
animations:^{
if (winnerIsDem) {
[_currentStateImageView setFrame:CGRectMake(-_currentStateImageView.frame.size.width,
_currentStateImageView.frame.origin.y,
_currentStateImageView.frame.size.width,
_currentStateImageView.frame.size.height)];
}
else {
[_currentStateImageView setFrame:CGRectMake(1024,
_currentStateImageView.frame.origin.y,
_currentStateImageView.frame.size.width,
_currentStateImageView.frame.size.height)];
}
}
completion:^(BOOL finished) {
// Do some stuff
}
];
}
];
}

最佳答案

我找到了问题的解决方案!您必须在动画的完成 block 中将 self.layer.beginTime 值重置为零。

例如

[UIView animateWithDuration:element.duration 
delay:element.delay
options:UIViewAnimationOptionCurveLinear
animations:^{
// Animate properties here!
}
} completion:^(BOOL finished){
// Reset BeginTime all the time
// So, in case a pause took place the delay values are valid again!
**self.layer.beginTime = 0.0f;**
}];

其余的暂停/恢复代码保持完全相同。

最好!

关于ios - 使用延迟动画暂停 CALayer 动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9805255/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com