我正在使用以下递归函数在iPhone上运行动画。设置动画时,用户交互将被阻止(动画完成后,用户交互将起作用)。我一直在尝试启用用户交互,并且尝试了

  • 将标志 UIViewAnimationOptionAllowUserInteraction 传递给animateWithDuration
  • this website开始定义了一个称为touchesBegan的函数。从不调用此函数(在我点击屏幕时在其他视图中调用)。
  • 在另一个线程上运行动画,并使用this SO answer指定的dispatch_asyncdispatch_sync。我尝试了几种方法,但是甚至不确定是否可以使用。
  • 放置一个UIButton来检测点击。与其链接的功能在大约1-2秒内没有被调用。

  • 对我来说,所有听起来像用户交互都没有启用。运行此动画时如何响应?

    该动画相当长且复杂-这是该应用存在的全部原因。每个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];
        }];
    }
    

    我希望这有帮助。

    10-08 05:55