2012-03-13 167 views
6

我正在使用UILongPressGestureRecognizer類來處理是否正在選擇一個項目。UILongPressGestureRecognizer停止觸摸不停止觸摸

邏輯如下:用戶在1秒內按下一個項目(UIView子類)。一旦檢測到手勢,該項目就會突出顯示並可移動。

用戶必須在屏幕上移動此項目而不停止觸摸它。

我面臨的問題是手勢識別陰影touchesBegan /移動/結束需要項目類來安排運動。

我試圖刪除檢測到的手勢,並檢測到選中的項目。但仍然將消息發送到手勢的句柄而不是調用觸摸方法。

任何人都知道任何方式來停止「聆聽」手勢識別器而不留下屏幕的手指?

謝謝。

下面的代碼:

-(void)addGestures 
{ 
    UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] 
               initWithTarget:self 
               action:@selector(handleLongPress:)]; 
    longPress.minimumPressDuration = iItemLongPressTime; 
    [self addGestureRecognizer:longPress]; 
    [longPress release]; 
} 
- (void)handleLongPress:(UILongPressGestureRecognizer*)sender { 
    if (sender.state == UIGestureRecognizerStateEnded) { 

     NSLog(@"Long press Ended"); 
    } 
    else { 
     if (self.isSelected) return; 

     if ([delegate respondsToSelector:@selector(singleTouch:)]) 
      [delegate singleTouch:self]; 

     [self removeGestureRecognizer:[self.gestureRecognizers objectAtIndex:0]]; 

     NSLog(@"Long press detected."); 
    } 
} 

正如你可以在其他分公司的委託調用使各項程序選擇,以紀念這個項目看,並隨即刪除的識別。

我失蹤了什麼?

- 編輯 -

完成!這工作:

#pragma mark Gesture Functions 
-(void)addGestures 
{ 
    UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] 
               initWithTarget:self 
               action:@selector(handleLongPress:)]; 
    longPress.minimumPressDuration = iItemLongPressTime; 
    [self addGestureRecognizer:longPress]; 
    [longPress release]; 
} 
- (void)handleLongPress:(UILongPressGestureRecognizer*)sender { 
    if (sender.state == UIGestureRecognizerStateEnded) { 

     NSLog(@"Long press Ended"); 
    } 
    else { 
     NSLog(@"Long press detected."); 

     if (self.isSelected) return; 

     if ([delegate respondsToSelector:@selector(singleTouch:)]) 
      [delegate singleTouch:self]; 

     [sender removeTarget:self action:@selector(handleLongPress:)]; 
     sender.enabled = NO; 
     [self removeGestureRecognizer:sender]; 



    } 
} 

關心!

回答

1

我腦海中有兩種解決方案。

  1. 對於動畫的UIView,請寫這是從UIView類繼承和實現,而不是寫Gustures處理動畫(如果觸摸代表沒有在當前類觸發)觸摸代表一個新的類。

2.在觸發一次後,我成功地刪除了UILongPressGestureRecognizer。

請參考下面的代碼。問我,如果你有

步驟我都做

我加入了一個UIView爲「MyView的」我的主視任何疑問

當主視點負載。

我已經給myView標籤(你可以給1,2,3 ...等)來區分龍頭視圖和主視圖子視圖。

將UILongPressGestureRecognizer手勢分配給myView並將目標指定爲「moveMe」方法。

當用戶長按myView時,會觸發「moveMe」方法。

然後我迭代與條件標記== 1

我從subview.As取出UILongPressGestureRecognizer的MAINVIEW子視圖,我們可以知道,標記1主視圖子視圖是MyView的。因此,NSLog(@「gesture removed」);和NSLog(@「moveMe」);將僅在一次登錄控制檯。這個NSLog(@「touchesBegan」);將首先觸發而不是觸發「moveMe」方法。

然後NSLog(@「touchesBegan」);將在刪除手勢後始終觸發。 「moveMe」方法不會觸發。

代碼

- (void)viewDidLoad {  
     //Adding to UIView to main view when application is loading. 
     UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(20, 20, 80, 80)];   
     myView.backgroundColor = [UIColor viewFlipsideBackgroundColor]; 
      myView.tag = 1; //adding a tag to identify it. 
     //Adding Long Press Gesture to the UIView. 
     UILongPressGestureRecognizer *myGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(moveMe:)]; 
     [myView addGestureRecognizer:myGesture]; 
     [myGesture release]; 
     myGesture = nil; 
     [self.view addSubview:myView]; 
     [myView release]; 
     myView = nil;  
     [super viewDidLoad]; 
    }  

    //Method to trigger when user pressed long on the added UIView. 

-(void)moveMe:(id)sender 
{ 
     for (UIView *subViews in [self.view subviews]) 
     { 
      if (subViews.tag == 1) { 
       [subViews removeGestureRecognizer:sender]; 
       NSLog(@"gesture removed"); 
      }  
     }  
     NSLog(@"moveMe"); 
    }  
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    NSLog(@"touchesBegan"); 
} 

或請參閱Disable gesture recognizer iOS

+0

請嘗試描述你的問題詳細 – 2012-03-13 16:52:18

+0

我試着發送刪除方法發件人作爲參數,但仍然無法正常工作。 – NemeSys 2012-03-13 17:05:14

+0

我編輯了我的答案... – 2012-03-14 16:10:47

4

是否自定義UIView類有它自己的觸摸處理代碼?如果不是,一個簡單的解決方案是將UILongPressGestureRecognizerallowableMovement屬性設置爲CGFLOAT_MAX或某個大數字,並使用手勢更新回調拖動您的自定義視圖。您可以在超級視圖上使用- (CGPoint)locationInView:(UIView *)view方法獲得位移,並將其位置與識別器開始時的位置進行比較。

+1

+1這是最簡單的解決方案。基本上,'如果你使用手勢識別器,然後使用手勢識別器'。 – NJones 2012-03-13 18:15:58

+1

沒有必要更改'allowableMovement'屬性;它僅用於測試失敗。來自'UILongPressGestureRecognizer.h'中的註釋'''在手勢失敗之前允許的最大移動像素數(一旦識別到(在minimumPressDuration之後),對於剩餘的觸摸跟蹤,手指移動沒有限制「 – NJones 2012-03-13 18:17:41

+0

嗨,謝謝你的答案。 UIView子類實現了touchesBegan/Moved/Ended以便在他們的超級視圖中操作大小和位置。手勢的使用來自對每個項目的觸摸不敏感的需要。目前我正在使用禁用手勢識別器對象的解決方案,並且像魅力一樣工作。 – NemeSys 2012-03-14 20:14:46