繁体   English   中英

UIView animateWithDuration和用户交互

[英]UIView animateWithDuration and user interaction

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

  • 将标志UIViewAnimationOptionAllowUserInteraction传递给animateWithDuration
  • 从此网站开始定义一个名为touchesBegan的功能。 从不调用此函数(在我点击屏幕时在其他视图中调用)。
  • 按照此SO答案指定的方式,在具有dispatch_asyncdispatch_sync的不同线程上运行动画。 我尝试了几种方法,但是甚至不确定是否可以使用。
  • 放置一个UIButton来检测水龙头。 链接的功能在约1-2秒内不会被调用。

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

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM