Пользовательская клавиатура iPhone - PullRequest
8 голосов
/ 23 октября 2009

Мне нужно (то есть требование клиента) предоставить пользовательскую клавиатуру для ввода текста как в текстовые поля, так и в области. У меня уже есть кое-что, что делает клавиатуру и добавляет тест к текстовому полю, однако я хотел бы сделать его более универсальным и заставить его действовать как стандартная клавиатура iphone, т.е. появляется, когда пользователь выбирает редактируемый текстовый элемент управления. В настоящее время мой контроллер знает цель, и цель не редактируется, чтобы предотвратить использование стандартной клавиатуры.

Есть ли способ подключиться к поведению текстовых элементов управления, чтобы я легко использовал собственную клавиатуру?

Спасибо, Вик

Ответы [ 4 ]

11 голосов
/ 23 октября 2009

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

[[NSNotificationCenter defaultCenter] addObserver:self 
                                      selector:@selector(modifyKeyboard:)
                                      name:UIKeyboardWillShowNotification
                                      object:nil];

Тогда, в вашем modifyKeyboard методе:

- (void)modifyKeyboard:(NSNotification *)notification 
{
    UIView *firstResponder = [[[UIApplication sharedApplication] keyWindow] performSelector:@selector(firstResponder)];

    for (UIWindow *keyboardWindow in [[UIApplication sharedApplication] windows])
        for (UIView *keyboard in [keyboardWindow subviews])
            if([[keyboard description] hasPrefix:@"<UIKeyboard"] == YES)
            {
                MyFancyKeyboardView *customKeyboard = [[MyFancyKeyboardView alloc] initWithFrame: CGRectMake(0, 0, keyboard.frame.size.width, keyboard.frame.size.height);
                [keyboard addSubview: customKeyboard];
                [customKeyboard release];
            }
}

Это добавит ваш вид поверх оригинальной клавиатуры, поэтому убедитесь, что вы делаете ее непрозрачной.

10 голосов
/ 02 мая 2011

Вы можете сделать это с iOS 3.2 или новее. Подробности см. В свойстве inputView объекта UITextField.

7 голосов
/ 23 октября 2009

Пока вы не отправляете свое приложение в магазин приложений, вы можете использовать метод под названием method swizzling для динамической замены методов основных классов во время выполнения. Например:

@interface UIControl(CustomKeyboard)
- (BOOL)__my__becomeFirstResponder
@end

@implementation UIControl(CustomKeyboard)
- (BOOL)__my__becomeFirstResponder
{
    BOOL becameFirstResponder = [self __my__becomeFirstResponder];
    if ([self canBecomeFirstResponder]) {
        [MyKeyboard orderFront];
    }
    return becameFirstResponder;
}

+ (void)initialize
{
    Method old = class_getInstanceMethod(self, @selector(becomeFirstResponder));
    Method new = class_getInstanceMethod(self, @selector(__my__becomeFirstResponder));
    method_exchangeImplementations(old, new);
}
@end

Пожалуйста, не используйте ничего подобного в любом рабочем коде. Кроме того, я на самом деле не проверял это, так что YMMV.

0 голосов
/ 23 октября 2009

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

Хотя я не могу сказать, понравится ли Apple это, и вам будет очень трудно написать свое собственное поведение, которое будет вести себя как другие клавиатуры. Настолько, что это должно быть объявлено плохой идеей.

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

...