如何限制touchesBegan和touchesEnded只有一个触摸?

时间:2012-03-22 07:29:56

标签: ios uigesturerecognizer

我有两个子视图的视图:

  1. UIImageView
  2. 一个小型的自定义视图,就像一个可以旋转的手的时钟。
  3. 我已经在自定义时钟视图的touchesBegan和touchesMoved中编写了旋转手的代码。

    此自定义视图放置在图像上,我已将双指缩放,旋转,panGesture添加到imageView。

    现在我的问题是每当我的两个手指中的一个触摸到这个时钟视图的手时,它们就会移动并旋转,这是我不想要的。

    我想限制他们的触摸,只有当我在他们身上做单指手势而不是在他背后的图像上有两个手指手势时。

    编辑:以下是我添加手势的代码

    UIPanGestureRecognizer *panGesture = [[[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)] autorelease];
    panGesture.maximumNumberOfTouches = 2;
    panGesture.minimumNumberOfTouches = 2;
    [self.imageView addGestureRecognizer:panGesture];
    

1 个答案:

答案 0 :(得分:1)

UIGestureRecognizer的方法-(NSUInteger)numberOfTouches可以告诉您视图上有多少触摸。此Event Handling Guide也可以帮助您:)

另一种方法是UITapGestureRecognizer,可以配置numberOfTouchesRequired将一个识别器限制为特定数量的手指。

修改

我建议您使用私有BOOL来锁定与其中一个手势识别器的交互,如果另一个手势识别器处于活动状态。

使用XCode 4及更高版本中的新LLVM编译器,您可以在实现(.m)文件中的默认类别中声明@private变量:

@interface YourClassName() {
  @private:
    BOOL interactionLockedByPanRecognizer;
    BOOL interactionLockedByGestureRecognizer;
}
@end

@implementation YourClassName
  ... your code ...
@end

处理平移交互的方法(我假设你最后会做一些动画来移动东西):

- (void)handlePan:(id)sender
{
  if (interactionLockedByGestureRecognizer) return;

  interactionLockedByPanRecognizer = YES;
  ... your code ...
  [UIView animateWithDuration:0.35 delay:0.0 options:UIViewAnimationCurveEaseOut
                 animations:^{
                   [[sender view] setCenter:CGPointMake(finalX, finalY)];
                 } 
                 completion:^( BOOL finished ) {
                   interactionLockedByPanRecognizer = NO;
                 }
 ];
}

现在您只需要检查touchesBegantouchesMovedtouchesEnded内是否有UIPanGestureRecognizer锁定了互动:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
  if (interactionLockedByPanRecognizer) return;
  interactionLockedByGestureRecognizer = YES;
  ... your code ...
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
  if (interactionLockedByPanRecognizer) return;
  ... your code ...
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
  if (interactionLockedByPanRecognizer) return;
  ... your code ...
  interactionLockedByGestureRecognizer = NO;
}