Управление клавиатурой

Когда пользователи касаются текстового поля, текстового представления или поля в веб-представлении, система выводит на экран клавиатуру. Можно сконфигурировать тип клавиатуры, выведенной на экран вместе с несколькими атрибутами клавиатуры. Когда сеанс редактирования начинается и заканчивается, также необходимо управлять клавиатурой. Поскольку клавиатура могла скрыть часть Вашего представления, которое является фокусом редактирования, это управление могло бы включать корректировку пользовательского интерфейса для повышения области фокуса так, чтобы было видимо выше клавиатуры.

Клавиатуры и методы ввода

Каждый раз, когда пользователь касается в объекте, способном к принятию ввода текста, объект просит, чтобы система вывела на экран надлежащую клавиатуру. В зависимости от потребностей Вашей программы и предпочтительного языка пользователя, система могла бы вывести на экран одну из нескольких различных клавиатур. Несмотря на то, что Ваше приложение не может управлять предпочтительным языком пользователя (и таким образом метод ввода клавиатуры), это может управлять атрибутами клавиатуры, указывающими ее надлежащее использование, такое как конфигурация любых специальных ключей и ее способов поведения.

Конфигурирование клавиатуры для текстовых объектов

Вы конфигурируете атрибуты клавиатуры непосредственно через текстовые объекты Вашего приложения. UITextField и UITextView классы оба соответствуют UITextInputTraits протокол, который определяет свойства для конфигурирования клавиатуры. При установке этих свойств программно или в Интерфейсном инспекторе Разработчика окно заставляет систему отображать клавиатуру определяемого типа.

Настройка клавиатуры по умолчанию разработана для общего ввода текста. Рисунок 5-1 выводит на экран клавиатуру по умолчанию вместе с несколькими другими настройками клавиатуры. Клавиатура по умолчанию выводит на экран алфавитную клавиатуру первоначально, но пользователь может переключить ее и вывести на экран числа и пунктуацию также. Большинство других клавиатур предлагает подобные функции как клавиатуру по умолчанию, но обеспечивает дополнительные кнопки, особенно подходящие для определенных задач. Однако телефонные и числовые клавиатуры предлагают существенно различное расположение, адаптирующееся к числовому вводу.

Рисунок 5-1  Несколько различных типов клавиатуры
Several different keyboard types

Для реализации предпочтений языка различных пользователей iOS также поддерживает различные методы ввода и раскладки клавиатуры для различных языков, некоторые из которых показаны на рисунке 5-2. Метод ввода и расположение для клавиатуры определяются предпочтениями языка пользователя. Ввод для некоторых из этих клавиатур имеет место на многократных этапах.

Рисунок 5-2  Несколько различных клавиатур и методов ввода
Several different keyboards and input methods

Конфигурирование клавиатуры для веб-представлений

Несмотря на то, что UIWebView класс не поддерживает UITextInputTraits протокол непосредственно, можно сконфигурировать некоторые атрибуты клавиатуры для элементов ввода текста. Например, можно включать autocorrect и autocapitalize атрибуты в определении входного элемента для указания способов поведения клавиатуры, как показано в следующем примере.

<input type="text" size="30" autocorrect="off" autocapitalize="on">

Можно также управлять, какой тип клавиатуры выведен на экран, когда пользователь касается текстового поля в веб-странице. Для отображения клавиатуры телефона почтовая клавиатура или клавиатура URL, использует tel, email, или url ключевые слова для type атрибут на входном элементе, соответственно. Для отображения числовой клавиатуры установите значение pattern атрибут к»[0-9]*«или»\d*".

Эти ключевые слова и атрибут образца являются частью HTML 5 и доступны в iOS. Следующий список показывает, как вывести на экран каждый тип клавиатуры, включая стандартную клавиатуру.

  • Текст: <input type="text"></input>

  • Телефон: <input type="tel"></input>

  • URL: <input type="url"></input>

  • Электронная почта: <input type="email"></input>

  • Почтовый индекс: <input type="text" pattern="[0-9]*"></input>

Управление клавиатурой

Несмотря на то, что много объектов UIKit выводят на экран клавиатуру автоматически в ответ на взаимодействие с пользователем, Ваше приложение все еще имеет некоторые обязанности по конфигурированию и управлению клавиатурой. Следующие разделы описывают ту ответственность.

Получение уведомлений клавиатуры

Когда клавиатура показана или скрыта, iOS отсылает следующие уведомления любым зарегистрированным наблюдателям:

Каждое уведомление клавиатуры включает информацию о размере и позиции клавиатуры на экране. Можно получить доступ к этой информации от userInfo словарь каждого уведомления с помощью UIKeyboardFrameBeginUserInfoKey и UIKeyboardFrameEndUserInfoKey ключи; прежний дает начинающийся кадр клавиатуры, последний конечный кадр клавиатуры (оба в координатах экрана). Необходимо всегда использовать информацию в этих уведомлениях в противоположность предположению, что клавиатура является определенным размером или в определенном расположении. Размер клавиатуры, как гарантируют, не будет тем же от одного метода ввода до другого и может также измениться между различными выпусками iOS. Кроме того, даже для единственного языка и системного выпуска, размерности клавиатуры могут варьироваться в зависимости от ориентации Вашего приложения. Например, рисунок 5-3 показывает относительные размеры клавиатуры URL и в портрете и в альбомных режимах. Используя информацию в уведомлениях клавиатуры гарантирует, чтобы у Вас всегда были корректный размер и информация о положении.

Рисунок 5-3  Относительные размеры клавиатуры в портрете и альбомных режимах
Relative keyboard sizes in portrait and landscape modes

Одна причина использовать уведомления клавиатуры состоит в том так, чтобы можно было изменить местоположение содержания, затененного клавиатурой, когда это видимо. Для получения информации о том, как обработать этот сценарий, посмотрите Движущееся Содержание, Расположенное Под Клавиатурой.

Нет никакого определенного отношения между синхронизацией уведомлений клавиатуры и синхронизацией переходов контроллера представления.

Отображение клавиатуры

Когда пользователь касается представления, система автоматически определяет что представление как первого респондента. Когда это происходит с представлением, содержащим доступный для редактирования текст, представление инициирует сеанс редактирования для того текста. В начале того сеанса редактирования представление просит, чтобы система вывела на экран клавиатуру, если это не уже видимо. Если клавиатура уже видима, изменение в первом респонденте заставляет ввод текста с клавиатуры быть перенаправленным к недавно коснувшемуся представлению.

Поскольку клавиатура выведена на экран автоматически, когда представление становится первым респондентом, Вы часто не должны делать ничего для отображения его. Однако можно программно вывести на экран клавиатуру для доступного для редактирования текстового представления путем вызова что представление becomeFirstResponder метод. Вызов этого метода заставляет цель просмотреть первого респондента и начинает процесс редактирования так же, как если бы пользователь коснулся на представлении.

Если Ваше приложение управляет несколькими основанными на тексте представлениями о единственном экране, это - хорошая идея отследить, какое представление в настоящее время является первым респондентом так, чтобы можно было отклонить клавиатуру позже.

Отклонение клавиатуры

Несмотря на то, что это обычно выводит на экран клавиатуру автоматически, система не отклоняет клавиатуру автоматически. Вместо этого это - ответственность Вашего приложения отклонить клавиатуру в подходящее время. Как правило, Вы сделали бы это в ответ на пользовательское действие. Например, когда пользователь касается кнопки Return или Done на клавиатуре или касается некоторой другой кнопки в интерфейсе Вашего приложения, Вы могли бы отклонить клавиатуру. В зависимости от того, как Вы сконфигурировали клавиатуру, Вы, возможно, должны были бы добавить некоторые дополнительные средства управления к своему пользовательскому интерфейсу для упрощения увольнения клавиатуры.

Для отклонения клавиатуры Вы вызываете resignFirstResponder метод основанного на тексте представления, которое в настоящее время является первым респондентом. Когда текстовое представление оставляет свое первое состояние респондента, оно заканчивает свой текущий сеанс редактирования, уведомляет его делегата того факта и отклоняет клавиатуру. Другими словами, если Вам вызвали переменную myTextField это указывает на UITextField объект, который в настоящее время является первым респондентом, отклоняя клавиатуру, так же прост как выполнение следующего:

[myTextField resignFirstResponder];

Все от той точки на обрабатывается для Вас автоматически текстовым объектом.

Движущееся содержание, расположенное под клавиатурой

Когда спросили вывести на экран клавиатуру, система задвигает его от нижней части экрана и располагает его по содержанию Вашего приложения. Поскольку это помещается поверх Вашего содержания, для клавиатуры возможно быть помещенным поверх текстового объекта, который пользователь хотел отредактировать. Когда это происходит, необходимо скорректировать содержание так, чтобы целевой объект остался видимым.

Корректировка Вашего содержания обычно включает временно изменение размеров того или большего количества представлений и расположения их так, чтобы текстовый объект остался видимым. Самый простой способ управлять текстовыми объектами с клавиатурой состоит в том, чтобы встроить их внутри a UIScrollView объект (или один из его подклассов как UITableView). То, когда клавиатура выведена на экран, все, что необходимо сделать, сбрасывается, предметная область прокрутки просматривает и прокручивает объект требуемого текста в позицию. Таким образом, в ответ на a UIKeyboardDidShowNotification, Ваш метод обработчиков сделал бы следующее:

  1. Получите размер клавиатуры.

  2. Скорректируйте нижнюю вставку содержания своего представления прокрутки высотой клавиатуры.

  3. Прокрутите поле целевого текста в представление.

Рисунок 5-4 иллюстрирует предыдущие шаги для простого приложения, встраивающего несколько текстовых полей внутри a UIScrollView объект. Когда клавиатура появляется, метод обработчиков уведомления корректирует содержание и вставки индикатора прокрутки представления прокрутки и затем использует scrollRectToVisible:animated: метод UIScrollView прокручивать коснувшееся текстовое поле (в этом случае почтовое поле) в представление.

  Содержание Корректировки рисунка 5-4 для размещения клавиатуры
Adjusting content to accommodate the keyboard

Перечисление 5-1 показывает код для регистрации для получения уведомлений клавиатуры и показывает методы обработчиков для тех уведомлений. Этот код реализован контроллером представления, управляющим представлением прокрутки, и scrollView переменная является выходом, указывающим на объект представления прокрутки. keyboardWasShown: метод получает размер клавиатуры из информационного словаря уведомления и корректирует нижнюю вставку содержания представления прокрутки высотой клавиатуры. Это также устанавливает scrollIndicatorInsets свойство прокрутки просматривает к тому же значению так, чтобы индикатор прокрутки не был скрыт клавиатурой. Обратите внимание на то, что keyboardWillBeHidden: метод не использует размер клавиатуры; это просто устанавливает представление прокрутки contentInset и scrollIndicatorInsets свойства к значению по умолчанию, UIEdgeInsetsZero.

Если активное текстовое поле скрыто клавиатурой, keyboardWasShown: метод корректирует смещение содержания представления прокрутки соответственно. Активное поле сохранено в пользовательской переменной (вызванный activeField в этом примере), который является задействованной переменной контроллера представления и набора textFieldDidBeginEditing: метод делегата, самостоятельно показанный в Перечислении 5-2. (В этом примере контроллер представления также действует как делегат к каждому из текстовых полей.)

Перечисление 5-1  , Обрабатывающее уведомления клавиатуры

// Call this method somewhere in your view controller setup code.
- (void)registerForKeyboardNotifications
{
    [[NSNotificationCenter defaultCenter] addObserver:self
            selector:@selector(keyboardWasShown:)
            name:UIKeyboardDidShowNotification object:nil];
 
   [[NSNotificationCenter defaultCenter] addObserver:self
             selector:@selector(keyboardWillBeHidden:)
             name:UIKeyboardWillHideNotification object:nil];
 
}
 
// Called when the UIKeyboardDidShowNotification is sent.
- (void)keyboardWasShown:(NSNotification*)aNotification
{
    NSDictionary* info = [aNotification userInfo];
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
 
    UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 0.0);
    scrollView.contentInset = contentInsets;
    scrollView.scrollIndicatorInsets = contentInsets;
 
    // If active text field is hidden by keyboard, scroll it so it's visible
    // Your app might not need or want this behavior.
    CGRect aRect = self.view.frame;
    aRect.size.height -= kbSize.height;
    if (!CGRectContainsPoint(aRect, activeField.frame.origin) ) {
        [self.scrollView scrollRectToVisible:activeField.frame animated:YES];
    }
}
 
// Called when the UIKeyboardWillHideNotification is sent
- (void)keyboardWillBeHidden:(NSNotification*)aNotification
{
    UIEdgeInsets contentInsets = UIEdgeInsetsZero;
    scrollView.contentInset = contentInsets;
    scrollView.scrollIndicatorInsets = contentInsets;
}

Перечисление 5-2 показывает некоторый дополнительный код, используемый контроллером представления, чтобы установить и очиститься activeField переменная в предыдущем примере. Во время инициализации каждое текстовое поле в интерфейсе устанавливает контроллер представления как своего делегата. Поэтому, когда текстовое поле становится активным, оно вызывает эти методы. Для получения дополнительной информации о текстовых полях и их уведомлениях делегата, посмотрите Управляющие Текстовые поля и текстовые Представления.

  Дополнительные методы перечисления 5-2 для отслеживания активного текстового поля.

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    activeField = textField;
}
 
- (void)textFieldDidEndEditing:(UITextField *)textField
{
    activeField = nil;
}

Существуют другие способы, которыми можно прокрутить отредактированную область в представлении прокрутки выше клавиатуры затемнения. Вместо того, чтобы изменить нижнюю вставку содержания представления прокрутки, можно расширить высоту довольного представление высотой клавиатуры и затем прокрутить отредактированный текстовый объект в представление. Несмотря на то, что UIScrollView класс имеет a contentSize свойство, которое можно установить с этой целью, можно также скорректировать кадр довольного представление, как показано в Перечислении 5-3. Этот код также использует setContentOffset:animated: метод для прокрутки отредактированного поля в представление, в этом случае, прокручивающем его чуть выше вершины клавиатуры.

Перечисление 5-3  , Корректирующее кадр довольного представление и прокручивающее поле выше клавиатуры

- (void)keyboardWasShown:(NSNotification*)aNotification {
    NSDictionary* info = [aNotification userInfo];
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
    CGRect bkgndRect = activeField.superview.frame;
    bkgndRect.size.height += kbSize.height;
    [activeField.superview setFrame:bkgndRect];
    [scrollView setContentOffset:CGPointMake(0.0, activeField.frame.origin.y-kbSize.height) animated:YES];
}