我正在尝试制作一个简单的西蒙游戏(不断增加的颜色序列闪烁,用户必须尝试重复该序列)。我正在进行的方式是通过4个UIViews和8个图像。所以有一个红色,蓝色,绿色和黄色的UIView。我有深绿色,浅绿色,深红色,浅红色等的GIF。
所以在我的代码中,我正在使用UIView的transitionWithView动画块: UIView imageView.image默认为暗色图像,此块正在转换为浅色图像,并在完成后返回到深色图像(以使其呈现“亮起”外观)。
- (void) animateColor:(NSString *)color
{
...
//do stuff to default the dark and light image name and which UIView to animate based on the color parameter
...
[UIView transitionWithView:imageView
duration:.5
options: UIViewAnimationOptionTransitionCrossDissolve | UIViewAnimationOptionAutoreverse
animations:^{
imageView.image = [UIImage imageNamed:lightImage];
}
completion:^(BOOL finished){
if (finished){
imageView.image = [UIImage imageNamed:darkImage];
}
}];
}
当我用一种颜色称它为此代码的方法时,这很好用。
问题是,假设我有一个NSArray或颜色,我想顺序动画。因此,如果我的数组是“蓝色”,“绿色”,我希望使用蓝色调用transitionWithView,为蓝色视图设置动画,然后为绿色视图设置动画。现在,它将同时为绿色视图和蓝色视图设置动画。
我现在正在尝试使用NSTimer,但没有太多运气。
任何建议都会非常感激。
答案 0 :(得分:5)
当我尝试连续执行多个转换时,我遇到了类似的问题。我通过简单地在完成块中设置状态变量来解决它。然后,此状态变量启用下一个转换的条件。好吧,因为我使用带有runloop方法的计时器,所以我的工作更容易:
- (void) runloop {
static int step = 1;
if (step == 1)
{
step = 0;
[UIView transitionWithView:imageView
duration:1
options:UIViewAnimationOptionTransitionCrossDissolve
animations:^{ imageView.image = [UIImage imageNamed:lightImage]; }
completion:^(BOOL finished){ step = 2; }];
}
if (step == 2)
{
step = 0;
[UIView transitionWithView:imageView
duration:1
options:UIViewAnimationOptionTransitionCrossDissolve
animations:^{ imageView.image = [UIImage imageNamed:darkImage]; }
completion:^(BOOL finished){ step = 0; }];
}
}
通过这种方式,您可以进行数十次转换,而不会迷失到嵌套块中。
答案 1 :(得分:3)
好的,所以在玩了一些/很多后我找到了解决方案。 首先,我将transitionWithView更改为如下所示:
[UIView transitionWithView:imageView
duration:1
options: UIViewAnimationOptionTransitionCrossDissolve
animations:^{
imageView.image = [UIImage imageNamed:lightImage];
}
completion:^(BOOL finished){
if (finished){
[UIView transitionWithView:imageView
duration:1
options:UIViewAnimationOptionTransitionCrossDissolve
animations:^{
imageView.image = [UIImage imageNamed:darkImage];
}
completion:^(BOOL done){
if (done){
// Do some program upkeep logic
}
}
];
}
}
];
上面的重大改变是删除了我原来的UIViewAnimationOptionAutoreverse,然后添加动画以从完成块中的光图像变为暗图像。
然后调用上面的方法(animateColor :),我遍历一个数组并使用一个带有增加的afterDelay的执行选择器:
for (NSString *color in self.randomPattern.patternArray) {
[self performSelector:@selector(animateColor:) withObject:color afterDelay:1.5*self.counter];
++self.counter;
}