- (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
这是对已发布对象的消息。
我在文档中找不到有关取消“排队”块的任何内容。
答案 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];
}