【问题标题】:Cancel multiple touches on the View取消对视图的多次触摸
【发布时间】:2013-10-25 14:54:28
【问题描述】:

我正在添加 UIPanGestureRecogniser 以在视图中拖放图像。我想一次只拖动一个图像。但我可以一次拖动两个图像。这不应该发生。

我从早上开始就被这个错误所困扰。我尝试了我在谷歌上找到的所有方法。

- (void)viewDidLoad
{
 [super viewDidLoad];
[self.view setMultipleTouchEnabled:NO];
for(UIImageView *iView in self.movableArray){
    if ([iView isMemberOfClass:[UIImageView class]]){
        UIPanGestureRecognizer * recognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)];
        [iView addGestureRecognizer:recognizer];
        [iView setUserInteractionEnabled:YES];
        recognizer.delegate = self;
    }
}
}



 - (IBAction)handlePan:(UIPanGestureRecognizer *)recognizer {
     [gameView bringSubviewToFront:[(UIPanGestureRecognizer *)recognizer view]];
     CGPoint translation = [recognizer translationInView:gameView];
    recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x,
                                     recognizer.view.center.y + translation.y);
     [recognizer setTranslation:CGPointMake(0, 0) inView:gameView];
     self.dragObjectImageView =  (UIImageView*)recognizer.view;


if(recognizer.state == UIGestureRecognizerStateBegan){
     int ind = [self.movableArray indexOfObject:self.dragObjectImageView];
    for(int i = 0 ; i < [self.movableArray count] ; i ++){
        if( i != ind ){
            [[self.movableArray objectAtIndex:i] removeGestureRecognizer:recognizer];
        }

    }

    self.homePosition = self.dragObjectImageView.frame;
}
if (recognizer.state == UIGestureRecognizerStateEnded) {
    CGPoint touchPoint = [recognizer locationInView:gameView];
    for (UIImageView *iView in self.staticArray) {
        if ([iView isMemberOfClass:[UIImageView class]]) {
            if (touchPoint.x > iView.frame.origin.x &&
                touchPoint.x < iView.frame.origin.x + iView.frame.size.width &&
                touchPoint.y > iView.frame.origin.y &&
                touchPoint.y < iView.frame.origin.y + iView.frame.size.height)
            {
                self.dropTargetImageView = iView;
            }
        }
    }

    if(self.dragObjectImageView.tag == self.dropTargetImageView.tag){
        self.dragObjectImageView.frame = CGRectMake(self.dropTargetImageView.frame.origin.x, self.dropTargetImageView.frame.origin.y + self.dropTargetImageView.frame.size.height/2 - 15, self.dragObjectImageView.frame.size.width, self.dragObjectImageView.frame.size.height);
        [self.dragObjectImageView removeGestureRecognizer:recognizer];
        }
    }else{
        self.dragObjectImageView.frame = self.homePosition;

    }
}
}

【问题讨论】:

    标签: ios objective-c uiview uiimageview uigesturerecognizer


    【解决方案1】:

    发生这种情况是因为您为每个imageViews 添加了一个UIPanGestureRecognizer。尝试只在您的self.view 中添加一个(并让您的imageViewssetUserInteractionEnabled:NO,否则他们会陷入困境)。也放

    recognizer.maximumNumberOfTouches = 1;
    

    在将其添加到视图之前。您现在要做的就是测试应该在handlePan 方法中拖动哪个图像视图。您应该检查识别器状态,当它变为UIGestureRecognizerStateBegan 时,您应该保存正在拖动的imageView。然后由于状态为UIGestureRecognizerStateChanged,只需拖动视图即可。您可以找出哪个视图被触摸(因为我不知道您的完整视图层次结构)的最通用方法是执行以下操作:

    NSUInteger index = [self.movableArray indexOfObjectPassingTest:(BOOL (^)(id obj, NSUInteger idx, BOOL *stop)){
        UIView* hitTest = (UIView*)obj;
        return [hitTest pointInside:firstTouch withEvent:nil];
    }];
    if ( index != NSNotFound )
       self.draggingView = self.moveableArray[index];
    else
       self.draggingView = nil;
    

    当然,如果 self.draggingView 为 nil,当用户四处移动时,您将什么也不做。

    【讨论】:

    • Unexpected interface name UIView 是我在使用此代码时遇到的错误。
    【解决方案2】:

    当你的

    - (IBAction)handlePan:(UIPanGestureRecognizer *)recognizer; 
    

    在其他图像上调用。您可以这样做,也可以禁用其他 UIPanGestureRecognizer,例如:myPanGestureRecognizer.enabled = NO;

    一个简单的例子:

    - (IBAction)handlePan:(UIPanGestureRecognizer *)recognizer
    {
      UIImageView *currentDraggedImageView = recognizer.view;
      // Based on this, you can iterate again on your UIImageViews and disable them.
      // Once your work is done with gesture recogniser, you can re-enable them.
    }
    

    【讨论】:

    • 是的,当我得到你建议的 currentDraggedImageView 时,我将用户交互禁用更改为 NO。它工作正常,但如果用户一次触摸 2 个图像,这两个图像正在移动。
    猜你喜欢
    • 2019-03-08
    • 1970-01-01
    • 2015-02-08
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2017-02-12
    相关资源
    最近更新 更多