2012-11-16 18 views
5

我想實現以下目標。創建一個UIView來捕獲水龍頭,但對所有其他手勢都是透明的

情景:iOS鍵盤在用戶鍵入特定文本字段時處於屏幕顯示狀態。用戶可以點擊鍵盤和文本字段以外的任何位置以關閉鍵盤(無需激活任何可見的按鈕)。此外,用戶可以在鍵盤外部將拖動到,並觀察某些可滾動視圖排列上的正常拖動行爲。

概念,我把一個「蓋」 UIView超極本屏幕其行爲使得:

  1. 如果用戶點擊了蓋,然後我捕捉龍頭(讓我能例如,關閉鍵盤)。通過攔截UIView子類中的觸摸事件或使用輕擊手勢識別器可輕鬆實現此操作。

  2. 如果用戶拖動上蓋子,然後蓋忽略轉發這些觸摸;這些被下面的圖層接收,就像它們沒有封面一樣。

所以說:用戶應當能夠滾動蓋下面的內容,而不是挖掘蓋下面的內容。輕敲鍵盤和文本區域的「外部」應該關閉鍵盤(和蓋子),但不應激活任何東西。

我該如何做到這一點?

+0

你必須考慮執行觸摸委託方法,並在觸摸傳給其背後都是對刷卡的意見。 ' - (無效)的touchesBegan:(NSSet中*)觸摸withEvent:方法(的UIEvent *)事件{ [奧瑟維尤的touchesBegan:觸摸withEvent:方法事件]; }'的另一種方式是實施,UIPanGestureRecognizer並設置cancelsTouchesInView = YES如'UIPanGestureRecognizer * GR = [[UIPanGestureRecognizer的alloc] initWithTarget:自動作:@selector(handlePan)]; [gr setCancelsTouchesInView:YES]; [myButton addGestureRecognizer:gr]; [GR發行]' – iDev

+1

@mjh,你有沒有找到一個解決這個? – kpozin

回答

0

1:點擊手勢識別器添加到視圖:

//Adding tap gesture 
    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapGesture:)]; 
    tapGesture.numberOfTapsRequired = 1; 
    [self.view addGestureRecognizer:tapGesture]; 

2:在handleTapGesture你的鍵盤

- (void)handleTapGesture:(UITapGestureRecognizer *)sender { 
    if (sender.state == UIGestureRecognizerStateRecognized) { 
     //Resign first responder for keyboard here 
    } 
} 

闡述了上面的答案有點resignFirstResponder。 UIGestureRecognizerStateRecognized確保它是單個標籤事件被識別。

這是你之後的功能嗎?

+0

他的問題是:「如果用戶拖拽的旗號,那麼蓋忽略所有觸摸;這些都是由高層接收到下面就像他們一直沒有蓋。」他已經想出瞭如何檢測觸摸。 – iDev

+0

如果'UIView'能夠識別水龍頭,那麼它的'.userInteractionEnabled'必須是'YES',因此它吃所有的觸摸事件,防止拖動從任何被認可是下面。 – mjh

2

添加點擊手勢通常的方式:

UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction:)]; 
[self.view addGestureRecognizer:tapGesture]; 

但你可能尋找的是這樣的:

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

文檔說:此方法要麼調用時識別手勢gestureRecognizer或otherGestureRecognizer會阻止其他手勢識別器識別其手勢。 (https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIGestureRecognizerDelegate_Protocol/index.html#//apple_ref/occ/intf/UIGestureRecognizerDelegate

這樣,您可能確定它是完全透明的,並且沒有任何東西會阻止您的識別器被調用。

0

轉發接收全觸控的自定義視圖:

class CustomView: UIView { 

    override func hitTest(point: CGPoint, withEvent event: UIEvent?) -> UIView? { 

     var hitView = super.hitTest(point, withEvent: event) 

     if hitView == self { 
      return nil 
     } 

     return hitView 
    }  
} 

從那裏,你可以去不同的方式,只是利用輕敲姿勢的。要麼觀察UIEvent的觸摸,要麼使用手勢識別器。

相關問題