>我有一个看起来像这样的视图层次结构
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
}
我遇到了同样的问题,并用一个天真的解决方案解决了它。
- 将视图从 UIView 实例更改为 UIControl 实例,以便它可以处理触摸事件。
-
在视图控制器中创建处理触摸事件的 IBAction 方法。在这种情况下,我们将从视图的子视图中辞职任何第一响应者。
- (IBAction)backgroundTapped:(id)sender { [contentView endEditing:YES]; }
contentView 只是指向视图的实例变量。您可以随心所欲地命名它。当您将消息传递
endEditing
视图时,它实质上是告诉其子视图辞去第一响应者,从而关闭键盘。 -
通过界面生成器连接目标(视图)和操作(您刚刚创建的 IBAction 方法),方法是打开视图的
connection inspector
,选择Touch Up Inside
并将其拖动到文件的所有者对象,然后选择方法的名称。
希望它有所帮助。
有点晚了,但一个快速、简单的解决方案如下:
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
[self.view endEditing:YES];
}
如果您点击任何空白区域,它就会被调用。
Mike Z的回答很好。但我认为当你使用Mike Z的答案时,下面的"if条件"在UIGestureRecognizerDelegate中会更容易和简单。
特别是当子视图不仅是按钮类型时,它们也可能是UITableViewCell,自定义视图等。
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
return touch.view == yourEmptySpaceView;
}