我有一系列图像,我想让它们重复一遍。但是,我想让上半场比赛进行,比如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:
感谢您的帮助。
此代码创建此效果,
答案 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秒钟。