我在iPhone上运行动画,具有以下递归功能。当我设置动画时,会阻止用户交互(当动画完成时,用户交互会起作用)。我一直在尝试启用用户互动,并尝试过
UIViewAnimationOptionAllowUserInteraction
传递给animateWithDuration
。touchesBegan
的函数。永远不会调用此函数(当我点击屏幕时在其他视图中调用)。dispatch_async
和dispatch_sync
指定的longAndComplicatedCalculation
的其他主题上运行动画。我尝试了几种方法,但我甚至不确定它是否有效。对我来说,没有启用所有听起来像用户交互的声音。这个动画运行时如何响应呢?
这个动画相当漫长而复杂 - 这就是这个应用程序存在的全部原因。每个- (void)startAnimation:(dispatch_block_t)block withUIBlock:(dispatch_block_t)uiBlock iteration:(int)N{
[UIView animateWithDuration:1.0
delay:0.0
options:(UIViewAnimationOptionCurveLinear | UIViewAnimationOptionAllowUserInteraction | UIViewAnimationOptionAllowAnimatedContent)
animations:^(void) {
[block invoke];
[uiBlock invoke];
}
completion:^(BOOL finished) {
if(FINISHED_IF && N<N_MAX) {
__weak id weakSelf = self;
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[weakSelf startAnimation:block withUIBlock:uiBlock iteration:N+1];
}];
}
}
];
}
大约需要1秒,这个函数被称为~30次。
[self startAnimation:^{
imageChange = [self longAndComplicatedCalculation];
} withUIBlock:^{
self.imageView.image = imageChange;
}
iteration:1];
使用
调用此函数{{1}}
答案 0 :(得分:2)
您正在从主线程调用两个块(块和uiBlock)。如果你的longAndComplicatedCalculation阻塞了线程,那么行为是正常的。你应该在一个单独的线程中调用你的计算,并在完成调用UIThread后启动动画。
为了更清楚,这就是我这样做的方式(没有你的确切实施和测试):
考虑到您的图像被声明为属性:
@property (nonatomic, retain) UIImage *changedImage;
当您调用动画时,您可以像
那样进行操作[NSThread detachNewThreadSelector:@selector(updateImage) toTarget:nil withObject:nil];
并在函数中进行计算,然后在UIThread上调用动画:
- (void)updateImage {
self.changedImage = [self longAndComplicatedCalculation];
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[self doAnimationAndChangeImage];
}];
}
我希望这会有所帮助。