在UIView animateWithDuration中取消阻止

时间:2011-07-20 17:36:14

标签: cocoa-touch objective-c-blocks

- (void) startLoading {

    [self blink];
} 

 - (void) blink {  

        [UIView animateWithDuration:0.5
                              delay: 0.0
                            options: UIViewAnimationOptionAllowUserInteraction | UIViewAnimationOptionCurveEaseOut
                         animations:^{
                            //animate stuff
                         }
                         completion:^(BOOL finished){
                                 [self blink];    
                         }];

}

- (void) stopLoading {
    //What goes here?
}

在我的UIView的initWithFrame中,我构建了一些加载器图形,然后从[self startLoading]启动加载器动画。

现在的问题是,如何阻止这种“无限循环”? stopLoading或dealloc方法中的内容可以很好地撕下所有内容?

当我忽略完成块的事实并且从超级视图中释放我的UIView时,一切都会好几秒钟(超过指定的0.5秒)然后应用程序崩溃并显示一条消息:

  

malloc: * mmap(size = 2097152)失败(错误代码= 12)    错误:无法分配区域   * *在malloc_error_break中设置断点以进行调试

我在malloc_error_break中有一个断点,罪魁祸首是动画块。

我假设UIView是通过从超级视图中删除而被释放的,之后执行完成块,引用self这是对已发布对象的消息。

我在文档中找不到有关取消“排队”块的任何内容。

3 个答案:

答案 0 :(得分:7)

要取消,请执行您希望能够取消的任何循环操作的操作:设置每次循环前检查的标记。所以:

- (void) stopLoading {
    kCancel = YES;
}

现在你的完成块看起来像这样:

completion:^(BOOL finished){
    if (!kCancel)
        [self blink];    
}];

kCancel可以是一个ivar,一个静态全局变量,无论如何。

答案 1 :(得分:1)

UIViewAnimationOptionRepeat为你提供了魔力

[UIView animateWithDuration:0.5
                      delay: 0.0
                    options: UIViewAnimationOptionAllowUserInteraction | UIViewAnimationOptionCurveEaseOut | UIViewAnimationOptionRepeat
                 animations:^{
                         //animate stuff
                 }
                 completion:^(BOOL finished){
                     NSLog(@"solved ");    
                 }];

答案 2 :(得分:0)

我只是重复动画并在一段时间后使用调度块将其终止:

- (void)animate // Blink a view three times
{
    // We need to stop the animation after a while (0.9 sec)
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 0.9 * NSEC_PER_SEC);
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void)
    {
        [view.layer removeAllAnimations];
        view.alpha = 0.0; // Animation clean-up
    });

    [UIView animateWithDuration:0.15 // 0.15*6=0.9: It will animate six times (three in reverse)
                          delay:0.0
                        options:UIViewAnimationOptionAutoreverse | UIViewAnimationOptionRepeat
                     animations:^{
                         view.alpha = 1.0; // Animation
                     }
                     completion:NULL];
}