Pull to refresh

UITextField и скрытие цифровой клавиатуры

Reading time2 min
Views2K
Хочу рассказать о способе скрытия цифровой клавиатуры на iPhone / iPad, которым не так давно пришлось воспользоваться.

Как известно, когда UITextField получает фокус, он показывает клавиатуру: алфавитно-цифровую, либо цифровую, в зависимости от типа. Скрыть эту клавиатуру можно либо нажав на кнопке Done на ней же (которая может иметь различные типы и надписи, настраивается), либо через вызов метода: [textField resignFirstResponder] К сожалению для разработчиков, на цифровой клавиатуре кнопки Done нет, на ее месте вообще пусто, и потому убрать клавиатуру можно только через вызов этого метода. До выхода версий iOS 3.2 и 4.0 это решалось с помощью добавления своей кнопки на это место (метод грязноватый, но работал и все были рады): neoos.
Но после выхода этих систем метод работать перестал. Для этого метода появился еще один хак, но по моему скромному мнению оно того не стоит.

Поэтому перерыв кучу ссылок решил сделать так: пусть пользователь нажмет где нибудь кроме клавиатуры, и она должна исчезнуть, на мой взгляд достаточно интуитивно. Поскольку на том месте, где клавиатуры нет, куча контролов, то поручить кому-то одному из них, подписавшись на их события не вариант, поэтому я решил просто показывать поверх всего прозрачную кнопку, а по ее событию UIControlEventTouchDown прятать клавиатуру. Само собой показывать кнопку стоит только тогда, когда появляется клавиатура, а при нажатии на кнопку скрывать клавиатуру и уничтожать кнопку. Реализовал это следующим образом:

Заголовочный файл (это для того, чтобы можно было ее запомнить и позже уничтожить):
UIButton* btnInvisible;

Также здесь необходимо подписать класс на протокол UITextFieldDelegate, чтобы можно было впоймать момент показа клавиатуры. Стандартная подписка на события UITextField почему то не работает. Ну и в Interface Builder нужно указать UITextField, что его делегат — это класс котроллера, или какой у вас будет отвечать за обработку событий.

Файл реализации:
#pragma mark -
#pragma mark UITextField delegate
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
//Create button
btnInvisible = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 320, 240)];
[btnInvisible addTarget:self action:@selector(hideKeyboard) forControlEvents:UIControlEventTouchDown];

//Show over the window view, which is at index 0 (usually)
CorreasAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
[appDelegate.window insertSubview:btnInvisible atIndex:1];

return YES;
}

- (void)hideKeyboard
{
//Hide keyboard
[quantityField resignFirstResponder];

//Hide and release button
[btnInvisible removeFromSuperview];
[btnInvisible release];
}

Вот собственно и все. Решение может не самое лучшее, потому как контролы, находящиеся под невидимой кнопкой становятся не доступны, и прийдется нажать 1 раз для того, чтобы убрать клавиатуру, а потом уже можно будет нажать на контрол. Но зато простое в реализации, и на мой взгляд достаточно удобное для пользователя.
Tags:
Hubs:
Total votes 13: ↑7 and ↓6+1
Comments6

Articles