objective-c:执行多个transitionWithView动画块

时间:2012-07-01 17:52:36

标签: objective-c uiview uiviewanimation uiviewanimationtransition

我正在尝试制作一个简单的西蒙游戏(不断增加的颜色序列闪烁,用户必须尝试重复该序列)。我正在进行的方式是通过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,但没有太多运气。

任何建议都会非常感激。

2 个答案:

答案 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;
    }