我需要为 3 个 UIView 设置动画(淡入/淡出)。1个动画时长为0.6s(淡入淡出周期为0.6+0.6s)。但我需要在 0.2 秒内启动动画。
- 第一个动画应该在 0.0 秒内启动。
- 第二个动画应该在 0.2 秒内启动。
- 第三个动画应该在 0.4 秒内启动。
并且所有这些都应该“无限期地”循环(直到某个触发)。
我目前拥有的:
- (void)playAnimation {
isAnimated = YES;
[self animateView:firstView afterDelay:0.0];
[self animateView:secondView afterDelay:0.2];
[self animateView:thirdView afterDelay:0.4];
}
- (void)stopAnimation {
isAnimated = NO;
}
- (void)animateView:(UIView *)animatedView afterDelay:(float)delay {
if(isAnimated) {
[UIView animateWithDuration:0.6 delay:delay options:UIViewAnimationOptionTransitionNone
animations:^ {
animatedView.alpha = 1.0;
} completion:^(BOOL finished) {
[UIView animateWithDuration:0.6 animations:^ {
animatedView.alpha = 0.0;
} completion:^(BOOL finished) {
[self animateView:animatedView afterDelay:0.0];
}];
}];
}
}
此代码的工作方式不可预测。有时查看动画会像我想要的那样工作(阶段 0.2 秒),有时它会在同一时间开始......这样做的正确方法是什么?我还尝试afterDelay:
从方法签名中删除部分并启动 animateView 方法,效果完全相同:
[self performSelector:@selector(animateView:) withObject:thirdView afterDelay:0.6];
更新
我注意到当繁重的网络内容在后台执行时动画“中断”(使用 AFNetworking 加载大图像)。我不介意动画是否会“冻结”一点(尽管我更喜欢根本没有延迟),但我真的想保持所有动画的阶段链接(具有相同的相位差)。
为了让问题更容易理解,我添加了图表。Y 是 alpha,X 是时间。前 3 个图表 - 我想要的。底部的 - 我目前拥有的。突出显示的区域是问题出现的地方。您可以看到第二个视图的动画冻结 0.2 秒并与第三个同步。所以他们开始在同一阶段闪烁。这只是一个例子。有时他们可以制作动画,有时所有 3 个视图在几轮动画中“同步”并在同一阶段闪烁......