繁体   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