Мне пришлось реализовать аналогичный UX для моего UITableView (внутри которого появляется UITextField).Сначала добавьте UITapGestureRecognizer
в tableView.Это начнет перехватывать все нажатия, которые происходят с этого момента.
UITapGestureRecognizer* tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
[self.tableView addGestureRecognizer:tapGestureRecognizer];
[tapGestureRecognizer release];
Однако побочным эффектом является то, что вы не хотите отмахиваться от клавиатуры, когда пользователь нажимает на сам UITextField.Таким образом, этот случай необходимо различать.
Реализация метода handleTap выглядит примерно так:
/*
In the text editing mode, listens to all taps occurring on the table view to exit the mode. There are two special cases to consider:
a) Text field's clear button
b) Text field
*/
-(void)handleTap:(UITapGestureRecognizer*)tapRecognizer
{
if(tapRecognizer.state == UIGestureRecognizerStateEnded)
{
//Figure out where the user tapped
CGPoint p = [tapRecognizer locationInView:textField];
CGRect textFieldBounds = textField.bounds;
CGRect clearButtonBounds = CGRectMake(textFieldBounds.origin.x + textFieldBounds.size.width - 44, textFieldBounds.origin.y, 44, textFieldBounds.size.height);
if(CGRectContainsPoint(clearButtonBounds, p))
textField.text = @"";
if(CGRectContainsPoint(textFieldBounds, p))
return;
[textField resignFirstResponder];
//remove the tap gesture recognizer that was added.
for(id element in self.tableView.gestureRecognizers)
{
if([element isKindOfClass:[UITapGestureRecognizer class]])
{
[self.tableView removeGestureRecognizer:element];
}
}
}
[self commitNewText];
}
}
HTH.Отметьте это как ответ, если вам это нравится.
-Акшай