2012-06-19 97 views
10

我有一個看起來像檢測上的UIView的「空白空間」

UIScrollView 
| 
+- UIView 
    | 
    +- UITextField 
    +- UITextField 
    +- UIButton 

我要的是其挖掘文本字段中的一個用戶,看到屏幕上的鍵盤視圖層次龍頭能夠點擊UIView的「空白區域」來隱藏鍵盤。所以,我不希望,例如,從UIButton的事件冒泡到UIView(這正是如果我將UITapGestureRecognizer添加到UIView會發生什麼)。

如何實現所需的功能?

回答

22

在你viewDidLoad方法添加此手勢識別:

UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)]; 
gestureRecognizer.cancelsTouchesInView = NO; 
[self.view addGestureRecognizer:gestureRecognizer]; 

然後添加dismissKeyboard方法:

- (void) dismissKeyboard{ 
    [YOURFIELDHERE resignFirstResponder]; 
} 

您還需要添加這使它這樣的按鈕仍然可點擊,而不是被手勢識別器覆蓋:

gestureRecognizer.delegate = self; // in viewDidLoad 
<UIGestureRecognizerDelegate> //in your header file 

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { 

    if ([touch.view isKindOfClass:[UIButton class]]){ 
    return NO; 
    } 
    return YES; // handle the touch 
} 
+0

GestureRecognizer的委託是我沒有使用的東西。相反,我使用愚蠢的子類來處理觸摸,這可以做得更容易。謝謝。 – Eugene

+0

我犯了這個錯誤不止一次。重新發明了車輪,並不是那麼優雅,只是發現有一種代表性的方法能夠達到我想要達到的目標,甚至超過了我的成就。在我看來,這是蘋果文檔的真正垮臺。 –

+0

很好的答案!非常感謝你! – HiveHicks

1

我遇到了同樣的問題,並用一種​​天真的解決方案來解決它。

  1. 將視圖從UIView的實例更改爲UIControl的實例,以便它可以處理觸摸事件。
  2. 在View Controller中創建一個處理觸摸事件的IBAction方法。在這種情況下,我們將從視圖的子視圖中退出任何第一響應者。

    - (IBAction)backgroundTapped:(id)sender { [contentView endEditing:YES]; }

    內容查看僅僅是個實例變量指向查看。你可以任何你想要的名字。當您將消息endEditing傳遞給視圖時,它基本上會通知其子視圖辭職第一響應者,因此解散鍵盤。

  3. 連接目標(視圖)和行動通過接口生成器(您剛剛創建IBAction爲方法),通過打開查看的connection inspector,選擇Touch Up Inside並將其拖動到文件的所有者對象,然後選擇方法的名稱。

希望它有幫助。

1

我知道這是有點晚了,但一個快速,簡單的解決方法是:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 

    [self.view endEditing:YES]; 
} 

如果您在任何空白處點擊它被調用。