Обнаружение касания UIView "пустое пространство"
У меня есть иерархия представлений, которая выглядит так:
UIScrollView
|
+- UIView
|
+- UITextField
+- UITextField
+- UIButton
Я хочу, чтобы пользователь использовал одно из текстовых полей и увидел, что клавиатура на экране позволяет использовать "пустое пространство" UIView, чтобы скрыть клавиатуру. Таким образом, я не хочу, например, событие от UIButton до появления UIView (что именно происходит, если я добавлю UITapGestureRecognizer в UIView).
Как я могу достичь желаемых функций?
Ответы
Ответ 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
}
Ответ 2
Я сталкиваюсь с этой же проблемой и решаю ее с наивным решением.
- Измените представление из экземпляра UIView на экземпляр UIControl, чтобы он мог обрабатывать события касания.
-
Создайте метод IBAction в контроллере просмотра, который обрабатывает событие касания. В этом случае мы отменим любого первого ответчика из представлений вида.
- (IBAction)backgroundTapped:(id)sender
{
[contentView endEditing:YES];
}
contentView - это только переменная экземпляра, указывающая на представление. Вы можете назвать все, что захотите. Когда вы передали сообщение endEditing
в представление, он по существу говорит своим подзапросам о выходе из первого ответчика, отбрасывая клавиатуру.
-
Подключите целевой (вид) и действие (метод IBAction, который вы только что создали) через Interface Builder, открыв connection inspector
в представлении, выберите Touch Up Inside
и перетащите его в объект File Owner, затем выберите имя метода.
Надеюсь, это поможет.
Ответ 3
Я знаю это немного позже, но быстрое, простое решение заключается в следующем:
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
[self.view endEditing:YES];
}
Он вызывается, если вы нажмете на любое пустое пространство.