10

我有一个看起来像这样的视图层次结构

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

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

如何实现所需的功能?

4

4 回答 4

23

在您的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
}
于 2012-06-19T13:06:42.590 回答
1

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

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

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

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

  3. 通过 Interface Builder 连接目标(View)和操作(您刚刚创建的 IBAction 方法),通过打开connection inspectorView 的 ,选择Touch Up Inside并将其拖动到 File's Owner 对象,然后选择方法的名称。

希望它有所帮助。

于 2012-11-19T15:33:15.467 回答
1

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

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

    [self.view endEditing:YES];
}

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

于 2013-09-10T22:32:52.317 回答
0

Mike Z 的回答很好。但是我认为当您使用 Mike Z 的答案时,UIGestureRecognizerDelegate 中的“if 条件”会更容易和简单。

尤其是当子视图不仅仅是按钮类型时,还可能是UITableViewCell、自定义视图等。

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    return touch.view == yourEmptySpaceView;
}
于 2021-12-28T09:30:42.000 回答