我有以下简单的UIImageView动画:
-(void) setupTheAnimation {
self.imgView.animationImages = imagesArr;
[self.imgView setAnimationRepeatCount:-1];
self.imgView.animationDuration =0.9;
[self.imgView startAnimating];
[self performSelector:@selector(stopTheAnimation) withObject:nil afterDelay:4.0];
}
-(void) stopTheAnimation {
[self.imgView stopAnimating];
}
但是当动画停止时我遇到问题我不知道它停止的最后一帧是什么!!所以动画的结尾一点也不顺利。
所以我需要:
1)知道动画结束的最后一帧是什么,所以我将其设置为动画的最后一个图像,这样就可以顺利停止。
2)逐渐停止此动画,即在停止之前更改其持续时间,然后先将其减速然后停止。
答案 0 :(得分:2)
我知道您的原始实现使用animationImages
,但我不知道如何直接使用animationImages
且持续时间不断变化。但是,这是一个非常简单的功能来实现自己。如果这样做,那么您可以在数组中的图像之间编码动态持续时间值。
在以下代码中,我使用自定义步进功能替换animationImages
,并在请求停止后动态调整持续时间。请注意,这与指定硬结束时间的原始代码略有不同。此代码指定齿轮旋转应开始减速的时间。
如果你真的有一个很难的动画片段,你可以调用stopTheAnimation
调用以考虑你选择的减速因子(我只是在减速期间每步增加10%的持续时间,直到步骤为止慢于给定的阈值):
// my animation stops when the step duration reaches this value:
#define STOP_THRESHOLD_SECONDS 0.1f
#define NUM_IMAGES 35
@implementation ViewController
{
NSMutableArray *imagesArr;
int currentImage;
BOOL stopRequested;
NSTimeInterval duration;
}
-(void) setupTheAnimation {
stopRequested = NO;
currentImage = 0;
duration = 0.9f / NUM_IMAGES;
[self stepThroughImages];
[self performSelector:@selector(stopTheAnimation) withObject:nil afterDelay:4.0];
}
- (void) stepThroughImages {
self.imgView.image = [imagesArr objectAtIndex: currentImage];
if (currentImage == NUM_IMAGES - 1) {
currentImage = 0;
} else {
currentImage++;
}
if (stopRequested && duration < STOP_THRESHOLD_SECONDS) {
// we're slowing down gradually
duration *= 1.1f;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(duration * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
[self stepThroughImages];
});
} else if (!stopRequested) {
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(duration * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
[self stepThroughImages];
});
}
}
-(void) stopTheAnimation {
stopRequested = YES;
}
答案 1 :(得分:0)
我只是通过使用块来了解这一点,但这是你如何做到的:
[UIImageView animateWithDuration:0.9f delay:0.0f options:UIViewAnimationOptionCurveEaseOut animations:^{
// animate what you want
self.imgView.transform = CGAffineTransformMakeScale(1.0f, 1.0f);
} completion:^(BOOL finished){
// animation is completed
self.imgView.image = image;
}];
选项'UIViewAnimationOptionCurveEaseOut'应逐渐停止动画。您可以使用其他选项来查看自己的效果。
答案 2 :(得分:0)
你的方法有一个问题:每秒的帧数不是恒定的(你减慢了时间)。
您确定需要动画效果吗?
如果您的动画可以通过几何(仿射)变换来实现,那么它会更好。
如果您的动画可以通过以下组合完成: