1

在頂級UIView上使用UIPanGestureRecognizer & UITapGestureRecognizer。UIPanGestureRecognizer頂級視圖無法獲取事件,消耗它們的子視圖

在界面生成器的設置:

  • 的ViewController(我們的主視圖控制器)
  • 的UIView(我們的主視圖和有線到我們的UIViewController
  • 我們的核心的UIView具有子視圖叫做「」,它簡直就是UIView
  • 視圖有4個子視圖(子女)的每個分別爲的UIButton的一個實例。
  • UIButton有其TouchUp Inside事件連接到UIViewController。
  • UIView的(我們的主頂級的UIView)具有UIPanGestureRecognizerUITapGestureRecognizer

這是我們所要完成的方案(akaThe行爲):

  1. 用戶點擊按鈕(單元格)。
  2. 該按鈕將從「正常」改爲「已選」。 (此工作正常,代碼簡單)
  3. 與選擇的項目,用戶可以在任何地方將他們的手指在屏幕上或上下移動

問題:

  • 極品知道何時平移停止。
  • 頂部的UIView沒有收到一個結束的手勢。
  • UIView不會收到touchesEnded事件。

你怎麼知道用戶何時舉起了他們的手指?假設當我的手指在UIButton上方時開始平移,而在發生平移時,UIButton會觸摸開始和結束事件。因此,您無法知道用戶何時停止在iPhone/iPad玻璃上移動手指。

回答

1

在您的視圖控制器中首先執行UIGestureRecognizerDelegate。 然後設置委託你的手勢識別自我和實現下面的方法

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

你的目標方法應該是這樣的:

-(void)gestureRegognized:(UIGestureRecognizer*)gestureRecognizer 
{ 
if ([gestureRecognizer isMemberOfClass:[UIPanGestureRecognizer class]]) 
{ 
    //check its state 
    if(gestureRecognizer.state==UIGestureRecognizerStateBegan) 
    { 
    // add your code here 
    } 
    else if(gestureRecognizer.state==UIGestureRecognizerStateEnded) 
    { 
    // pan gesture ended code goes here 
    } 

} 
else if([gestureRecognizer isMemberOfClass:[UITapGestureRecognizer class]]) 
{ 
    if(gestureRecognizer.state!=UIGestureRecognizerStateFailed) 
    { 
    // tap gesture detected 
    } 
} 
} 
+0

謝謝。看來我的問題是我在界面構建器中添加了UIPanGestureRecognizer,設置了委託和操作。在IBAction中,我將方法設置爲 - (IBAction)onPanGesture :(UIPanGestureRecognizer *)識別器;這是失敗的。當我簡單地對手勢識別器的創建進行硬編碼時(如上所述),現在一切正常。 – user3615480

+0

我可以提供幫助。如果對我的答案感到滿意,請接受它。 – Pancho

相關問題