![](/img/trans.png)
[英]Enable user interaction for gesture recognizer during UIView.animateWithDuration()
[英]UIView animateWithDuration and user interaction
我正在使用以下递归函数在iPhone上运行动画。 设置动画时,用户交互将被阻止(动画完成后,用户交互将起作用)。 我一直在尝试启用用户交互,并且尝试了
UIViewAnimationOptionAllowUserInteraction
传递给animateWithDuration
。 touchesBegan
的功能。 从不调用此函数(在我点击屏幕时在其他视图中调用)。 dispatch_async
和dispatch_sync
的不同线程上运行动画。 我尝试了几种方法,但是甚至不确定是否可以使用。 对我来说,所有听起来像用户交互都没有启用。 运行此动画时如何响应?
该动画相当长且复杂-这是此应用存在的全部原因。 每个longAndComplicatedCalculation
大约需要1 longAndComplicatedCalculation
,此函数称为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];
}];
}
}
];
}
该函数用
[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];
}];
}
我希望这有帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.