2012-10-15 45 views
0

我有一個UIView一個其中有一個UILongPressGestureRecognizer這樣的:UIGestureRecognizers依賴

movementGestureRecognizer = [[UILongPressGestureRecognizer alloc] init]; 
    [movementGestureRecognizer setDelegate:self]; 
    [movementGestureRecognizer setMinimumPressDuration:0.0f]; 
    [self addGestureRecognizer:movementGestureRecognizer]; 

已把您可以通過它的名字就能看出,它是用來,儘快,因爲我長按UIView,我我能夠移動它。

的事情是,我希望也能增加一些其他類型的手勢,例如:

 optionsGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(options:)]; 
     [optionsGestureRecognizer setNumberOfTapsRequired:2]; 
     [self addGestureRecognizer:optionsGestureRecognizer]; 

的問題是,我不能打電話options:因爲movementGestureRecognizer是「吸吮「所有的手勢。有沒有辦法阻止或取消movementGestureRecognizer或延遲?


編輯1.0

我能夠調用options:TapGestureRecognizer如果我做了以下內容:

[movementGestureRecognizer setMinimumPressDuration:0.1f]; 

不過,這是不是在可用性方面的完美解決方案.. 。

+0

嘗試將長按所需的水龍頭數量設置爲0 – vishy

+0

這是什麼意思? – Peres

回答

0

我能夠做來一個解決方案如下:

1)我UIView實施「國家機器」,通過禁用和基於它的狀態使UIGestureRecognizers

2)使用UIPanGestureRecognizer四處移動的UIView's

3)和this問題。

+0

有趣!我還在尋找一種「有限狀態機」解決方案來管理相當複雜的菜單狀態。如果我可能會問,你是從頭開始編寫「狀態機」,還是考慮使用類似[State Machine Compiler](http://smc.sourceforge.net/)的東西?或者,狀態機編譯器會爲了你的目的而過度使用? –

+0

在我的'UIView'上有3個狀態:正常狀態,添加新的子'UIView'狀態,調整狀態。基於這3個狀態,我啓用和禁用'UIGesturesRecognizers',因此它們不會相互重疊。目前我有6個'UIGesturesRecognizers',一切正常。我還用UIScrollGesture做了一些事情,所以當你用其他手勢做你的東西時,它不會「順便」。 – Peres

0

我不太清楚,但你可以嘗試實行gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer: DELE門像這樣也許:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 
{ 
    return YES; 
} 

另外你可以指定這樣的手勢識別器之間的依賴關係:

[optionsGestureRecognizer requireGestureRecognizerToFail: movementGestureRecognizer]; 

我建議你閱讀了在UIGestureRecognizer Class Reference細節!

您還可以找到好的帖子詳細闡述了同樣的話題here

+0

這是正確的解決方案。 – koki

0

輕敲和長按之間的區別在於,在將其從觸摸表面釋放之前,您將手指按下多長時間。因此,你會希望有大於0

的最低按持續時間另外,你可以做到以下幾點:

movementGestureRecognizer.delaysTouchesBegan = NO; 
movementGestureRecognizer.delaysTouchesEnded = NO; 

這將允許系統識別水龍頭,以及長按。

+0

不會改變任何添加delayTouches的東西。 – Peres