Обнаружение касания 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];
}

Он вызывается, если вы нажмете на любое пустое пространство.