Как создать собственную клавиатуру - PullRequest
56 голосов
/ 10 января 2011

Как мне создать собственную клавиатуру / клавиатуру, которая будет отображаться, когда кто-нибудь нажимает на UITextField? Я хотел бы отобразить клавиатуру с кнопками a, b, c, 1, 2, 3 и кнопкой ввода, больше ничего. Клавиатура должна работать и вести себя как стандартная клавиатура (в поведении), но она определенно будет выглядеть по-другому.

Я не могу найти ни одного примера, и лучшее, что я нашел, это отфильтровать символы с помощью существующей клавиатуры, что является недопустимым решением.

Ответы [ 5 ]

38 голосов
/ 10 января 2011

Я думаю, что вы ищете " Руководство по программированию текста, Интернета и редактирования для iOS "

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

Чтобы получить эту функцию, если ваше приложениеиспользует объекты UITextView и UITextField для редактирования текста, просто назначьте пользовательские представления свойствам inputView и inputAccessoryView.Эти пользовательские представления отображаются, когда текстовый объект становится первым респондентом ...


Это может послужить хорошим введением: настройка клавиатуры iOS

5 голосов
/ 11 февраля 2013

Вы можете использовать Custom-iOS-Keyboards библиотека на Github.

3 голосов
/ 24 февраля 2012

Прежде всего создайте представление (я сделал это в отдельном nib-файле и загрузил его таким образом):

    NSArray *views = [[NSBundle mainBundle] loadNibNamed:@"ReducedNumericKeyboardView"
                                                   owner:self
                                                 options:nil];
    keyBView = (ReducedNumericKeyboardView*)[views objectAtIndex:0];

После этого я установил его в качестве представления ввода для текстового поля, где я хочучтобы использовать его (и на самом деле, это краткий ответ на ваш вопрос;)):

    [self.propertyEditor setInputView:keyBView];  

При нажатии на поле я прокручиваю вид щенка (при необходимости), чтобы не закрыть поле:

CGRect textFieldRect = [self.tableViewController.view.window convertRect:propertyEditor.bounds fromView:propertyEditor];
CGRect viewRect = [self.tableViewController.view.window convertRect:self.tableViewController.view.bounds fromView:self.tableViewController.view];
CGFloat midLine = textFieldRect.origin.y+.5*textFieldRect.size.height;

CGFloat numerator = midLine - viewRect.origin.y - MINIMUM_SCROLL_FRACTION*viewRect.size.height;
CGFloat denominator = (MAXIMUM_SCROLL_FRACTION - MINIMUM_SCROLL_FRACTION)*viewRect.size.height;
CGFloat heightFraction = MIN(1, MAX(0, numerator/denominator));

animateDistance = floor(PORTRAIT_USER_INPUT_VIEW_HEIGHT*heightFraction);

CGRect viewFrame = self.tableViewController.view.frame;
viewFrame.origin.y -= animateDistance;
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationDuration:USER_INPUT_ANIMATION_DURATION];
[self.tableViewController.view setFrame:viewFrame];
[UIView commitAnimations];

Когда редактирование закончено, я прокручиваю вид вниз:

        CGRect viewFrame = self.tableViewController.view.frame;
        viewFrame.origin.y += animateDistance;
        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationBeginsFromCurrentState:YES];
        [UIView setAnimationDuration:USER_INPUT_ANIMATION_DURATION];
        [self.tableViewController.view setFrame:viewFrame];
        [UIView commitAnimations];

Используемые ограничения устанавливаются следующим образом:

static const CGFloat USER_INPUT_ANIMATION_DURATION = 0.3;
static const CGFloat PORTRAIT_USER_INPUT_VIEW_HEIGHT = 180;

static const CGFloat MINIMUM_SCROLL_FRACTION = 0.1;
static const CGFloat MAXIMUM_SCROLL_FRACTION = 0.2;
2 голосов
/ 20 мая 2014

Вы хотите установить значение для

inputView

на вашем UITextField. Вам нужно будет полностью реализовать новую клавиатуру или механизм ввода в представлении, которое вы предоставляете.

С другой стороны,

inputAccessoryView 

можно использовать для добавления небольшого количества функциональности. Представление будет размещено над системной клавиатурой и будет доставлено и отклонено вместе с ним.

2 голосов
/ 13 ноября 2012

К сожалению, «Руководство по программированию текста, Интернета и редактирования для iOS», упомянутое выше, не дает никакой информации о том, что делать с символом после нажатия клавиши.Это самая сложная часть при реализации клавиатуры в iOS.

Я создал полный рабочий пример шестнадцатеричной цифровой клавиатуры, которую можно легко настроить так, как вам нужно.

Конкретные детали приведены в моем другом ответе на эту тему: https://stackoverflow.com/a/13351686/937822

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...