2

我正在为几个视图设置动画,但animateWithDuration:我根本无法检测到对它们的任何触摸。

我尝试过简单的触摸处理 ( touchesEnded:) 和tapGestureRecognizer.

首先我用它们为它们设置了动画,CGAffineTransformTranslation但后来我意识到如果我用它检查坐标就不会这样,touchesMoved:所以我切换到为 frame 属性设置动画。我很快注意到,帧值在动画期间并没有真正改变,所以我放弃了 touchesEnded: 想法。所以我改成了一个也不起作用的tapGestureRecognizer。

我已经在所有视图上启用了 userInteraction,并且我还向UIViewAnimationOptionAllowUserInteraction动画添加了选项。

这是动画的代码和之前发生的事情:

// init the main view
singleFingerTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapOnItem:)]; // singleFingerTap is an ivar

// code somewhere:
// userItem is a subview of MainView
[userItem addGestureRecognizer:singleFingerTap];

[UIView animateWithDuration:animationTime
                      delay:0.0f
                    options:UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionCurveLinear | UIViewAnimationOptionAllowUserInteraction
                 animations:^{
                     userItem.frame = CGRectMake(-(self.bounds.size.width + userItem.frame.size.width), userItem.frame.origin.y, userItem.frame.size.width, userItem.frame.size.height);
                 }

                 completion:^(BOOL finished) {
                     if (finished) {
                         [unusedViews addObject:userItem];
                         [userItem removeFromSuperview];
                         [userItem removeGestureRecognizer: singleFingerTap];
                     }
                 }
 ];

这是手势识别器:

- (void) handleTapOnItem:(UITapGestureRecognizer *)recognizer{
   NSLog(@"Touched");
}

那么我如何才能真正从动画视图中获得触摸或最佳解决方案是什么?向每个视图添加透明 uibutton 不是一种选择。:(

4

2 回答 2

3

当动画应用于视图时,动画属性立即更改为其最终值。您在屏幕上实际看到的是视图层的表示层。

不久前,我写了一篇关于命中测试动画视图/图层的博客文章,其中更详细地解释了这一切。

于 2012-07-27T13:21:58.297 回答
0

当使用 Core Animation 移动任何东西时,对象上的触摸会暂停,直到对象完成移动。有趣的花絮,如果你移动对象并触摸它的最终位置,触摸就会被拾取。这是因为一旦动画开始,对象的帧就设置为结束点,当它在屏幕上移动时它不会更新。

您可能需要研究 Quartz 或 OpenGL ES 等替代技术,以在视图移动时检测它们的触摸。

于 2012-07-27T13:15:06.727 回答