2009-10-22 3 views
8

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

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

Thanks, Vic

+0

Надеюсь, ваш клиент не намерен отправлять это (предположительно неигровое) приложение в App Store ... –

+0

Почему бы и нет? _______ –

+0

Изменение основного пользовательского интерфейса iPhone? –

ответ

11

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

[[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]; 
      } 
} 

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

+0

Еще одна интересная идея, спасибо, я тоже попробую, спасибо. – vickirk

0

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

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

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

+0

К сожалению, клавиатура, в которой мы нуждаемся, на самом деле не просто клавиатура с символами на ней, она содержит несколько символов (правда, это может быть скрыто в этом mannner), но есть кнопки, которые делают намного больше, чем ввод одного символа ,Правда, я мог бы добавлять кнопки в другом месте, но это было бы контр-интуитивным и выглядело бы ужасно. У меня уже есть клавиатура, работающая по мере необходимости, мне просто нужно ее легко подключить, просто пожелал, чтобы материал касания на андроиде был стабильным мишенью, так как ipod :-( – vickirk

7

До тех пор пока вы не отправляете свое приложение в магазин приложений, вы можете использовать метод под названием метод 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

Интересная идея, спасибо, я дам ей Попробуйте – vickirk

10

Вы можете сделать это с iOS 3.2 или новее. Для получения дополнительной информации проверьте свойство inputView UITextField.

+1

+1 за хороший ответ :) –

Смежные вопросы