更改动画速度系列图像

时间:2014-03-10 01:42:04

标签: ios animation uiimage

我有一系列图像,我想让它们重复一遍。但是,我想让上半场比赛进行,比如2秒,然后下半场比赛将在5秒内进行。

使用以下

播放一系列图像非常容易
   - (void) completeCycles:(int) cycles inhalePercentage:(int) inhalePercent exhalePercentage:(int) exhalePercent totalCycleTime:(int) time
   {
    NSMutableArray *textures = [NSMutableArray array];

    for (int i = 0; i < kNumberBreathingImages; i++) {
        NSString *textureName = [NSString stringWithFormat:@"breath%d.png", i];

        for (int i = 0; i < inhalePercent; i++) {
            [textures addObject:[UIImage imageNamed:textureName]];
        }
    }

    for (int i = kNumberBreathingImages - 1; i > 0; i--) {
        NSString *textureName = [NSString stringWithFormat:@"breath%d.png", i];
        for (int i = 0; i < exhalePercent; i++) {
            [textures addObject:[UIImage imageNamed:textureName]];
        }
    }

    self.animationImageView.animationImages = textures;
    self.animationImageView.animationDuration = time;
    self.animationImageView.animationRepeatCount = cycles;
    [self.animationImageView startAnimating];
    }

但是,我希望动画的前半部分采用 x 时间,而后半部分采用 y 时间。

我认为上述内容不允许我这样做,只是想知道更好的方法是什么。

非常确定需要使用

UIView animateWithDuration:animations: completion:

感谢您的帮助。

此代码创建此效果,

2 个答案:

答案 0 :(得分:3)

UIImageView上的动画系统非常有限。我建议您使用2图像视图进行自己的实现。

您可以使用UIView animateWithDuration

在一个图像视图中更改图像并淡入淡出

我为你写了一个方法。请注意:我没有测试过。

它假设你的框架在一个名为'frames'的数组中,并且有两个UIIMageView放在彼此的顶部,称为'imgv1'和'imgv2'

-(void)performAnimationOfFrameAtIndex:(NSNumber*)indexNum
{        
int index = [indexNum intValue];
if(index >= frames.count)
{
    return;
}
UIImage *img = [frames objectAtIndex:index];

UIImageView *imgIn;
UIImageView *imgOut;
if(index % 2 == 0)
{
    imgIn = imgv1;
    imgOut = imgv2;
}
else 
{
    imgIn = imgv2;
    imgOut = imgv1;
}
imgIn.image = img;
[self.view sendSubviewToBack:imgIn];

[UIView animateWithDuration:0.1 animations:^
{
    imgIn.alpha = 1;
    imgOut.alpha = 0;
} completion:^(BOOL finished)
{
    [self performSelectorOnMainThread:@selector(performAnimationOfFrameAtIndex:) withObject:[NSNumber numberWithInt:index+1] waitUntilDone:NO];
}];

}

感谢您的想法,

我更改了上面的代码以获得我想要的效果,现在它完美无缺。即使持续时间为0秒,alpha也会产生“频闪”效果。

这是我的最终代码

享受100: - )

- (void) performAnimationOfFrameAtIndex:(NSNumber*)indexNum
{
    int index = indexNum.intValue;
    if (index >= self.frames.count) return;

    UIImage *img = self.frames[index];

    UIImageView *imgIn;
    UIImageView *imgOut;

    float speed = (index <= self.frames.count / 2) ? 0.1 : 1; // first half : second half speed.

    if (index % 2 == 0) {
        imgIn = self.animationImageViewOne;
        imgOut = self.animationImageViewTwo;
    }
    else {
        imgIn = self.animationImageViewTwo;
        imgOut = self.animationImageViewOne;
    }

    imgIn.image = img;

    [self.view sendSubviewToBack:imgIn];
    [self performSelector:@selector(performAnimationOfFrameAtIndex:) withObject:[NSNumber numberWithInt:index+1]  afterDelay:speed];
}

答案 1 :(得分:2)

  

我认为上述内容不允许我这样做,只是想知道更好的方法是什么。

实际上,它会。您只需在形成序列时重复图像。对于第一组中的图像,重复每一次,然后再进行下一次。对于第二组中的图像,重复每个图像五次,然后再进行下一个图像。现在将动画总时间设置为7秒。由于最初每组中的图像数量大致相同,因此您可以很容易地看到这意味着第一组将花费大约2秒钟,第二组将花费大约5秒钟。