2009-10-22 16 views
8

Ho bisogno (ad esempio di un requisito del cliente) di fornire una tastiera personalizzata affinché l'utente possa digitare il testo in entrambi i campi di testo e aree. Ho già qualcosa che fa la tastiera e appende test a un campo di testo, tuttavia mi piacerebbe renderlo più generico e farlo agire come la tastiera standard per iPhone, cioè apparire quando l'utente seleziona un controllo di testo modificabile. Attualmente il mio controller conosce il target e il target non è modificabile per impedire la tastiera standard.Tastiera iPhone personalizzata

C'è un modo per agganciare il comportamento dei controlli di testo in modo da utilizzare facilmente la mia tastiera?

Grazie, Vic

+0

Spero che il tuo cliente non intenda inviare questa app (presumibilmente non di gioco) all'App Store ... –

+0

Perché no? _______ –

+0

Modifica di un componente dell'interfaccia utente principale di iPhone? –

risposta

11

Ecco un'idea: modifica la tastiera esistente in base alle tue esigenze. In primo luogo, registrarsi per essere avvisati quando appare sullo schermo:

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

Poi, nel vostro modifyKeyboard metodo:

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

Questo aggiunge la sua opinione sulla parte superiore della tastiera originale, in modo da assicurarsi si rendono opaco.

+0

Un'altra idea interessante, grazie anche a questo provo, grazie – vickirk

0

Dipende da come lo si desidera. Personalmente volevo una tastiera numerica, ma non mi piaceva il tastierino numerico, quindi ho usato la tastiera standard e aggiunto in un filtro standard, che fa parte delle opzioni, che rifiuta tutte le pressioni dei tasti che non sono numeri o spazio o cancella.

Non posso dire se Apple vorrà questo, però, e farai molto duro a scrivere il tuo comportamento che si comporta come le altre tastiere. Tanto che dovrebbe essere dichiarato una cattiva idea.

aggiornamento in base al tuo commento sembra più che devi solo creare una vista con molti pulsanti su di essa e spostare questa vista con l'opzione di animazione attivata. Potrebbe quindi scorrere verso l'alto dal basso come una tastiera e scivolare di nuovo quando viene rimosso.

+0

Sfortunatamente la tastiera di cui abbiamo bisogno non è proprio una semplice tastiera con caratteri, ha alcuni caratteri su di essa (il vero resto potrebbe essere nascosto in questo modo) ma ci sono pulsanti che fanno molto più che digitare un singolo carattere .Vero, potrei aggiungere pulsanti altrove, ma sarebbe contro-intuitivo e sembrerebbe terribile. Ho già la tastiera che funziona come richiesto, ho solo bisogno di collegarlo facilmente, ho appena desiderato che il materiale touch su Android fosse un obiettivo stabile come l'iPod :-( – vickirk

7

Finché non si invia l'app all'app store, è possibile utilizzare una tecnica denominata metodo swizzling per sostituire dinamicamente i metodi delle classi core in fase di runtime. Per esempio:

@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 

prega non usare nulla di simile in qualsiasi codice di produzione. Inoltre, non ho ancora provato questo, quindi YMMV.

+0

Un'idea interessante, grazie darò un prova – vickirk

10

È possibile farlo con iOS 3.2 o successivo. Controllare la proprietà inputView di UITextField per i dettagli.

+1

+1 per una buona risposta :) –

Problemi correlati