检测点击UIView的“空白空间”

时间:2012-06-19 13:00:01

标签: ios objective-c cocoa-touch uiview event-handling

我有一个看起来像那个

的视图层次结构
UIScrollView
 |
 +- UIView
     |
     +- UITextField
     +- UITextField
     +- UIButton

我想要的是用户点击其中一个文本字段并看到屏幕上的键盘能够点击UIView的“空白空间”来隐藏键盘。所以,我不希望,例如,来自UIButton的事件冒泡到UIView(如果我将UITapGestureRecognizer添加到UIView就会发生这种情况)。

如何实现所需的功能?

3 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:1)

我遇到同样的问题并用天真的解决方案来解决它。

  1. 将视图从UIView实例更改为UIControl实例,以便它可以处理触摸事件。
  2. 在View Controller中创建一个处理触摸事件的IBAction方法。在这种情况下,我们将从视图的子视图中撤消任何第一响应者。

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

    contentView只是指向View的实例变量。你可以任意命名。当您将消息endEditing传递给视图时,它实际上会告知其子视图辞职第一响应者,从而解除键盘。

  3. 通过Interface Builder连接目标(视图)和操作(刚刚创建的IBAction方法),打开视图的connection inspector,选择Touch Up Inside并将其拖到文件所有者对象,然后选择方法的名称。

  4. 希望它有所帮助。

答案 2 :(得分:1)

我知道这有点晚了,但快速,简单的解决方案如下:

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

    [self.view endEditing:YES];
}

如果点击任何空白区域,它就会被调用。