2009-10-22 22 views
8

Necesito (es decir, un requisito del cliente) para proporcionar un teclado personalizado para que el usuario escriba texto en campos de texto y áreas. Ya tengo algo que funciona con el teclado y anexa prueba a un campo de texto; sin embargo, me gustaría hacerlo más genérico y hacer que actúe como el teclado estándar de iPhone, es decir, aparece cuando el usuario selecciona un control de texto editable. Actualmente mi controlador conoce el objetivo y el objetivo no es editable para evitar el teclado estándar.Teclado de iPhone personalizado

¿Hay alguna manera de engancharme al comportamiento de los controles de texto, así que uso mi propio teclado fácilmente?

Gracias, Vic

+0

Espero que su cliente no tenga la intención de enviar esta aplicación (supuestamente sin juegos) a la tienda de aplicaciones ... –

+0

¿Por qué no? _______ –

+0

¿Cambiando un componente de interfaz de usuario central del iPhone? –

Respuesta

11

Aquí hay una idea: modifique el teclado existente para sus propias necesidades. En primer lugar, registrarse para ser notificado cuando aparece en la pantalla:

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

Luego, en su modifyKeyboard método:

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

Esto añade su punto de vista en la parte superior del teclado original, por lo que asegúrese de que usted lo hace opaco.

+0

Otra idea interesante, gracias voy a probar esto también, gracias. – vickirk

0

Depende de cómo lo desee. Yo personalmente quería un teclado numérico, pero no me gustó el teclado numérico, así que usé el teclado estándar y agregué un filtro estándar, que es parte de las opciones, que rechaza todas las pulsaciones de teclas que no son números ni espacio o eliminar

No puedo decir si a Apple le gustaría esto, sin embargo, y va a ser muy difícil escribir su propio comportamiento que actúa como los otros teclados. Tanto es así, que debería ser declarada una mala idea.

actualización Según su comentario, parece más bien que solo tiene que crear una vista con muchos botones y mover esta vista con la opción animada activada. Entonces podría deslizarse hacia arriba desde la parte inferior como un teclado y deslizarse de nuevo cuando se descarta.

+0

Desafortunadamente, el teclado que necesitamos no es simplemente un teclado con caracteres, tiene algunos caracteres (el resto verdadero podría estar oculto en este modelo) pero hay botones que hacen mucho más que escribir un solo carácter .Es cierto que podría agregar botones en cualquier otro lugar, pero sería contra intuitivo y se vería horrible. Ya tengo el teclado funcionando como es necesario, solo necesito conectarlo fácilmente, solo desearía que el toque en Android fuera un objetivo tan estable como el ipod :-( – vickirk

7

Siempre que no envíe su aplicación a la tienda de aplicaciones, puede utilizar una técnica llamada método swizzling para reemplazar dinámicamente los métodos de las clases principales en tiempo de ejecución. Por ejemplo:

@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 

favor no usan nada como esto en cualquier código de producción. Además, en realidad no lo he probado, así que YMMV.

+0

Una idea interesante, gracias, le daré una intento. – vickirk

10

Puede hacerlo con iOS 3.2 o posterior. Verifique la propiedad inputView de UITextField para más detalles.

+1

+1 por una buena respuesta :) –

Cuestiones relacionadas