【问题标题】:Detect tap on UIView's "empty space"检测对 UIView 的“空白空间”的点击
【发布时间】:2012-06-21 12:34:28
【问题描述】:

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

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

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

如何实现所需的功能?

【问题讨论】:

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


    【解决方案1】:

    在您的 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
    }
    

    【讨论】:

    • GestureRecognizer 的委托是我没有使用过的东西。相反,我使用愚蠢的子类化来处理触摸,这本来可以更容易完成。谢谢。
    • 我不止一次犯过这个错误。重新发明了轮子,但不是很优雅,只是发现有一个委托方法比我设法完成的工作做得更好。在我看来,这是苹果文档的真正失败。
    • 很好的答案!非常感谢!
    • 这很好用。没有黑客,没有子类,只有干净的代码。谢谢。
    【解决方案2】:

    我遇到了同样的问题,并用一个幼稚的解决方案来解决。

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

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

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

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

    希望对您有所帮助。

    【讨论】:

      【解决方案3】:

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

      -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
      
          [self.view endEditing:YES];
      }
      

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

      【讨论】:

        【解决方案4】:

        Mike Z 的answer 不错。但是我认为当您使用 Mike Z 的answer 时,UIGestureRecognizerDelegate 中的“if 条件”会更容易和简单。

        特别是当子视图不只是按钮类型时,还可能是UITableViewCell、自定义视图等。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多