0

我想UIViews根据传入的数据动态插入动画。

我发送两个异步 URLRequest 并从另一个线程取回接收到的数据。

我正在观察一个属性,该属性会动态填充来自不同请求的数据。所以 KVO 给我发消息,可能是直接一个接一个。

使用第一条传入消息,我启动了一些相关动画。在动画期间,它经常发生,新数据到达并向我的观察者发送消息。然后我想等到动画结束并为新数据启动动画。

我正在寻找一个不错的实现,而不是带有 while 循环的东西,等到 bool 发生变化。

编辑: 考虑到我不能说,哪些数据首先出现。所以我不能将动画方法定义为第一个。

4

4 回答 4

2

如何创建一个可变数组作为动画的 kvoToDoList。将启动动画所需的任何信息放入其中(例如触发 kvo 的对象)。

然后当观察到 kvo 时,将对象添加到数组中并调用如下动画函数:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {

    self.kvoToDoList insertObject:object atIndex:0];
    // not sure here what you need to remember in order to do the animation, let's say it's just the object
    [self doAnimations];
}

- (void)doAnimations {

    if (self.kvoToDoList.count == 0) return;
    id object = [self.kvoToDoList lastObject];  // FIFO since we insert at index 0
    [self.kvoToDoList removeLastObject];

    [UIView animateWithDuration:someDuration delay:0.0 options:someOptions animations:^{
        // do animations here based on object
    } completion:^(BOOL finished) {
        // call this recursively, but performSelector so we don't wind up the stack
        [self performSelector:@selector(doAnimations) withObject:nil afterDelay:0.0];
    }];
}
于 2013-01-31T18:05:46.513 回答
2

如何将传入的视图添加到 mutableArray,然后使用如下内容:

-(void) animateView:(UIView *)viewToAnimate{    

    [UIView animateWithDuration:0.5 animations:^{
        viewToAnimate.alpha = 0;
    }
                 completion:^(BOOL finished){
                     [_mutableArrayOfAnimationViews removeObject: viewToAnimate];
                     if ([_mutableArrayOfAnimationViews count] > 0) {
                         UIView *newAnimationView = [_mutableArrayOfAnimationViews objectAtIndex:0];
                         [self animateView: newAnimationView];
                     }
                 }];   
}

然后你还可以检查视图何时进来,数组是否已经为空,如果是,则调用上述方法...

于 2013-01-31T18:00:29.680 回答
0

用一个好主意回答我自己的问题:
您如何看待 executionQueue 或 executionBlock?

我想,当一些动画正在进行时,我将执行代码保存到一个块变量中。在动画完成块中,我查看是否存在有效的执行块。

如果有,执行,如果没有,什么也不做。

当异步消息进来时,我还需要保存要加载的块的动画状态。

于 2013-01-31T18:19:55.427 回答
0

也许在第一个动画的完成例程中发布通知:

UIView animateWithDuration:delay:options:animations:completion:
于 2013-01-31T17:52:52.140 回答