UIView animateWithDuration和用户交互

时间:2014-02-28 23:21:58

标签: ios animation user-interface

我在iPhone上运行动画,具有以下递归功能。当我设置动画时,会阻止用户交互(当动画完成时,用户交互会起作用)。我一直在尝试启用用户互动,并尝试过

  • 将旗帜UIViewAnimationOptionAllowUserInteraction传递给animateWithDuration
  • this website开始定义名为touchesBegan的函数。永远不会调用此函数(当我点击屏幕时在其他视图中调用)。
  • dispatch_asyncdispatch_sync指定的longAndComplicatedCalculation的其他主题上运行动画。我尝试了几种方法,但我甚至不确定它是否有效。
  • 将UIButton放入以检测水龙头。它所链接的功能不会被调用~1-2秒。

对我来说,没有启用所有听起来像用户交互的声音。这个动画运行时如何响应呢?

这个动画相当漫长而复杂 - 这就是这个应用程序存在的全部原因。每个- (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}}

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];
    }];
}

我希望这会有所帮助。