簡體   English   中英

檢測點擊 UIView 的“空白空間”

[英]Detect tap on UIView's "empty space"

我有一個看起來像這樣的視圖層次結構

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

我想要的是點擊其中一個文本字段並在屏幕上看到鍵盤的用戶能夠點擊 UIView 的“空白空間”來隱藏鍵盤。 因此,例如,我不希望來自 UIButton 的事件冒泡到 UIView(如果我將 UITapGestureRecognizer 添加到 UIView 會發生這種情況)。

我怎樣才能實現所需的功能?

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
}

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

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

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

    contentView只是指向View的實例變量。 你可以任意命名。 當您將消息endEditing傳遞給View時,它實際上會告訴其子視圖重新endEditing第一個響應者,從而解除鍵盤。

  3. 通過Interface Builder連接目標(視圖)和操作(剛剛創建的IBAction方法),打開View的connection inspector ,選擇Touch Up Inside並將其拖到File的Owner對象,然后選擇方法的名稱。

希望它有所幫助。

我知道它有點晚了,但快速,簡單的解決方案如下:

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

    [self.view endEditing:YES];
}

如果點擊任何空白區域,它就會被調用。

Mike Z 的回答很好。 但是我認為當您使用 Mike Z's answer時,UIGestureRecognizerDelegate 中的“if 條件”會更容易和簡單。

特別是當子視圖不僅是按鈕類型的時候,還可能是 UITableViewCell、自定義視圖等。

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    return touch.view == yourEmptySpaceView;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM