7

我有一个继承 UIImageView 的可拖动类。当视图没有动画时,拖动工作正常。但是在动画时它不会响应触摸。动画完成后,触摸再次起作用。但我需要它在触摸时暂停动画并在触摸结束时恢复。我花了一整天的时间研究它,但无法弄清楚原因。

这是我的动画代码。

[UIView animateWithDuration:5.0f 
  delay:0 
  options:(UIViewAnimationOptionCurveLinear | UIViewAnimationOptionAllowUserInteraction) 
  animations:^{ 
  self.center = CGPointMake(160,240);
  self.transform = CGAffineTransformIdentity;
  }
  completion:nil
];

- (void) touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event {
    NSLog(@"touch");
    CGPoint pt = [[touches anyObject] locationInView:self];
    startLocation = pt;
    [self.layer removeAllAnimations];
    [[self superview] bringSubviewToFront:self];
}
4

1 回答 1

9

那是因为 ios 在动画开始时将您的动画视图放置到目标位置,但将其绘制在路径上。因此,如果您在移动时点击视图,您实际上是在其框架之外的某个位置点击。

在动画视图的初始化中,将 userInteractionEnabled 设置为 NO。所以触摸事件由superview处理。

self.userInteractionEnabled = NO;

在您的 superview 的 touchesBegan 方法中,检查您的动画视图的presentationLayer 位置。如果它们与触摸位置匹配,则将 touchesBegan 消息重定向到该视图。

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    CGPoint point = [[touches anyObject] locationInView:self.view];
    CGPoint presentationPosition = [[animatingView.layer presentationLayer] position];

    if (point.x > presentationPosition.x - 10 && point.x < presentationPosition.x + 10
        && point.y > presentationPosition.y - 10 && point.y < presentationPosition.y + 10) {
        [animatingView touchesBegan:touches withEvent:event];
    }
}
于 2010-12-13T19:09:57.190 回答