Muitas respostas interessantes. Eu gostaria de compilar diferentes abordagens para a solução que achei mais adequada a um cenário UITableView (é o que eu costumo usar): O que geralmente queremos é basicamente esconder o teclado em dois cenários: tocando fora dos elementos da IU de texto, ou ao rolar para baixo / cima no UITableView. O primeiro cenário pode ser facilmente adicionado por meio de TapGestureRecognizer, e o segundo por meio do método UIScrollViewDelegate scrollViewWillBeginDragging :. Primeira ordem do dia, o método para ocultar o teclado:
/**
* Shortcut for resigning all responders and pull-back the keyboard
*/
-(void)hideKeyboard
{
//this convenience method on UITableView sends a nested message to all subviews, and they resign responders if they have hold of the keyboard
[self.tableView endEditing:YES];
}
Este método resigna qualquer interface do usuário textField das subvisualizações dentro da hierarquia de visão UITableView, então é mais prático do que resignar cada elemento individualmente.
Em seguida, cuidamos de dispensar por meio de um gesto de toque externo, com:
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
[self setupKeyboardDismissGestures];
}
- (void)setupKeyboardDismissGestures
{
// Example for a swipe gesture recognizer. it was not set-up since we use scrollViewDelegate for dissmin-on-swiping, but it could be useful to keep in mind for views that do not inherit from UIScrollView
// UISwipeGestureRecognizer *swipeUpGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)];
// swipeUpGestureRecognizer.cancelsTouchesInView = NO;
// swipeUpGestureRecognizer.direction = UISwipeGestureRecognizerDirectionUp;
// [self.tableView addGestureRecognizer:swipeUpGestureRecognizer];
UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)];
//this prevents the gestureRecognizer to override other Taps, such as Cell Selection
tapGestureRecognizer.cancelsTouchesInView = NO;
[self.tableView addGestureRecognizer:tapGestureRecognizer];
}
Definir tapGestureRecognizer.cancelsTouchesInView como NO é para evitar que o gestoRecognizer substitua o funcionamento interno normal do UITableView (por exemplo, para não interferir na seleção da célula).
Finalmente, para lidar com a ocultação do teclado na rolagem para cima / para baixo no UITableView, devemos implementar o método scrollViewWillBeginDragging: do protocolo UIScrollViewDelegate, como:
arquivo .h
@interface MyViewController : UIViewController <UIScrollViewDelegate>
arquivo .m
#pragma mark - UIScrollViewDelegate
-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
[self hideKeyboard];
}
Espero que ajude! =)