2013-10-25 61 views
0

我添加了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; 

    } 
} 
} 

回答

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是零,你會怎麼做當用戶正在平移時沒有任何東西。

+0

意外接口名稱UIView的就是我同時使用此代碼得到的錯誤。 – Chandu

+0

我也更新了我的代碼。 – Chandu

0

你應該建立一種機制,以setUserInteractionEnable = NO當你

- (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. 
} 
+0

是的,我將用戶交互禁用爲NO,當我得到像你建議的currentDraggedImageView。它工作正常,但如果用戶一次觸摸2個圖像,這兩個正在移動。 – Chandu