我正在尝试在我的应用程序中制作一些动画,但我遇到了一些错误。一切都从我的“startAnimatingIndicators”方法开始。这个方法的作用是将两条垂直线(它们都在屏幕的每个边缘)动画到我的主视图的中心。完成后,它会调用另一个动画,使两条线最终到达我的视图中心,同时在中心淡入一条新的垂直线。
这一系列动画循环(如您所见,是一个递归方法),直到我按下一个调用 StopAnimatingIndicators 方法的停止按钮。
第一次一切正常,但有时(并非总是),当我第二次运行动画时,它开始不同。有时它从中心的两条垂直线开始,然后它们转到各自的屏幕边缘,然后动画正常流动。有时,两条垂直线都正常到达它们的中心,但它们会继续移动,直到它们到达对面的边缘,然后动画就会正常流动。
我不知道为什么会这样,所以我希望你能给我一些想法。我认为这可能与我的 CGAffinityIdentityTransform 相关,但我无法弄清楚到底是什么问题。我正在使用的代码如下。谢谢!
- (void)startAnimatingIndicators
{
NSInteger metronomePreset = [(NSNumber*)[self.metronomePresets objectAtIndex:self.metronomePresetIndex] intValue];
NSTimeInterval duration = (60.0 / metronomePreset);
CGFloat firstPartXTranslation = self.videoPreviewView.center.x - self.indicatorLeft.center.x - self.indicatorLeft.frame.size.width;
CGFloat secondPartXTranslation = self.indicatorLeft.frame.size.width;
[self animateIndicatorsWithFirstPartXTranslation:firstPartXTranslation secondPartXTranslation:secondPartXTranslation andDuration:duration];
}
- (void)animateIndicatorsWithFirstPartXTranslation:(CGFloat)firstPartXVariation secondPartXTranslation:(CGFloat)secondPartXTranslation andDuration:(NSTimeInterval)duration
{
[UIView animateWithDuration:duration
delay:0
options:UIViewAnimationCurveEaseIn | UIViewAnimationOptionAllowUserInteraction
animations:^{
self.finishingIndicator.alpha = 0.0;
self.indicatorLeft.transform = CGAffineTransformTranslate(self.indicatorLeft.transform, firstPartXVariation, 0.0);
self.indicatorRight.transform = CGAffineTransformTranslate(self.indicatorRight.transform, -firstPartXVariation, 0.0);
}
completion:^(BOOL finished){
if(finished)
{
[UIView animateWithDuration:ANIMATION_END_DURATION
delay:0
options:UIViewAnimationCurveLinear | UIViewAnimationOptionAllowUserInteraction
animations:^{
self.finishingIndicator.alpha = 1.0;
self.indicatorLeft.transform = CGAffineTransformTranslate(self.indicatorLeft.transform, secondPartXTranslation, 0.0);
self.indicatorRight.transform = CGAffineTransformTranslate(self.indicatorRight.transform, -secondPartXTranslation, 0.0);
}
completion:^(BOOL finished){
[self stopAnimatingIndicators];
if(finished)
{
[self animateIndicatorsWithFirstPartXTranslation:firstPartXVariation secondPartXTranslation:secondPartXTranslation andDuration:duration];
[self playSound:@"metronome" withExtension:@"wav"];
}
}
];
}
}
];
}
- (void)stopAnimatingIndicators
{
self.indicatorLeft.transform = CGAffineTransformIdentity;
self.indicatorRight.transform = CGAffineTransformIdentity;
[CATransaction begin];
[self.finishingIndicator.layer removeAllAnimations];
[self.indicatorLeft.layer removeAllAnimations];
[self.indicatorRight.layer removeAllAnimations];
[CATransaction commit];
self.finishingIndicator.alpha = 0.0;
[self resetIndicatorsPosition];
}
- (void)resetIndicatorsPosition
{
CGRect indicatorLeftFrame = self.indicatorLeft.frame;
CGRect indicatorRightFrame = self.indicatorRight.frame;
indicatorLeftFrame.origin.x = LEFT_INDICATOR_X_OFFSET;
indicatorRightFrame.origin.x = RIGHT_INDICATOR_X_OFFSET;
self.indicatorLeft.frame = indicatorLeftFrame;
self.indicatorRight.frame = indicatorRightFrame;
}