我正在使用以下递归函数在iPhone上运行动画。设置动画时,用户交互将被阻止(动画完成后,用户交互将起作用)。我一直在尝试启用用户交互,并且尝试了
UIViewAnimationOptionAllowUserInteraction
传递给animateWithDuration
。 touchesBegan
的函数。从不调用此函数(在我点击屏幕时在其他视图中调用)。 dispatch_async
和dispatch_sync
。我尝试了几种方法,但是甚至不确定是否可以使用。 对我来说,所有听起来像用户交互都没有启用。运行此动画时如何响应?
该动画相当长且复杂-这是该应用存在的全部原因。每个
longAndComplicatedCalculation
大约需要1秒,此函数称为〜30次。- (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];
}];
}
}
];
}
该函数用
[self startAnimation:^{
imageChange = [self longAndComplicatedCalculation];
} withUIBlock:^{
self.imageView.image = imageChange;
}
iteration:1];
最佳答案
您正在从主线程调用这两个块(块和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];
}];
}
我希望这有帮助。