2009-10-22 9 views
8

Ich brauche (d. H. Eine Kundenanforderung), um eine benutzerdefinierte Tastatur für den Benutzer zur Verfügung zu stellen, Text in beide Textfelder und Bereiche einzugeben. Ich habe bereits etwas, das die Tastatur tut und Test an ein Textfeld anhängt, aber ich würde es generischer machen und es wie die Standard-iPhone-Tastatur verhalten lassen, d. H. Erscheinen, wenn der Benutzer ein editierbares Text-Steuerelement auswählt. Momentan kennt mein Controller das Ziel und das Ziel ist nicht editierbar, um die Standardtastatur zu verhindern.Benutzerdefinierte iPhone-Tastatur

Gibt es eine Möglichkeit, in das Verhalten von Textsteuerelementen einzugreifen, so dass ich meine eigene Tastatur leicht verwenden kann?

Danke, Vic

+0

Ich hoffe, dass Ihr Kunde nicht vorhat, diese (vermutlich Nicht-Spiel) App an den App Store zu senden ... –

+0

Warum nicht? _______ –

+0

Ändern einer zentralen UI-Komponente des iPhone? –

Antwort

11

Hier ist eine Idee: Ändern Sie die vorhandene Tastatur auf Ihre eigenen Bedürfnisse. Zuerst registrieren benachrichtigt werden, wenn es auf dem Bildschirm erscheint:

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

Dann in Ihrem modifyKeyboard Methode:

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

Diese oben auf der ursprünglichen Tastatur Ihrer Ansicht fügt, so stellen Sie sicher, dass Sie es machen undurchsichtig.

+0

Eine andere interessante Idee, danke ich werde dies auch versuchen, danke. – vickirk

0

Es hängt wie benutzerdefinierte Sie es wollen. Ich persönlich wollte nur eine numerische Tastatur, aber nicht die Nummernblock, so dass ich die Standardtastatur verwendet und einen Standardfilter hinzugefügt, der Teil der Optionen ist, die alle Tastenbetätigungen zurückweist, die keine Zahlen oder Leerzeichen sind oder löschen.

Ich kann nicht sagen, ob Apple würde das aber, und Sie werden es sehr schwer haben, Ihr eigenes Verhalten zu schreiben, das sich wie die anderen Tastaturen verhält. So sehr, dass es eine schlechte Idee sein sollte.

update Basierend auf Ihrem Kommentar klingt es eher so, als müssten Sie nur eine Ansicht mit vielen Schaltflächen erstellen und diese Ansicht mit aktivierter Option animieren. Es könnte dann wie eine Tastatur von unten nach oben rutschen und bei der Entlassung wieder wegrutschen.

+0

Leider ist die Tastatur, die wir brauchen, nicht wirklich eine Tastatur mit Buchstaben, sondern ein paar Zeichen (wahr, der Rest könnte in diesem Mann versteckt sein), aber es gibt Knöpfe, die viel mehr tun, als einen einzigen Buchstaben einzugeben .Wahr, ich könnte Tasten an anderer Stelle hinzufügen, aber es wäre kontra-intuitiv und sieht schrecklich aus. Ich habe bereits die Tastatur arbeiten, wie erforderlich, ich muss nur in leicht verdrahten, nur wünschte, die Touch-Sachen auf Android war so stabil ein Ziel wie der iPod :-( – vickirk

7

Solange Sie Ihre App nicht an den App Store senden, können Sie mit einer Methode namens Methode swizzling Methoden der Kernklassen zur Laufzeit dynamisch ersetzen. Zum Beispiel:

@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 

Bitte nichts wie dies in jedem Produktionscode verwenden. Außerdem habe ich das nicht wirklich getestet, also YMMV.

+0

Eine interessante Idee, danke ich werde es geben versuchen Sie es. – vickirk

10

Sie können es mit iOS 3.2 oder höher tun. Überprüfen Sie die Eigenschaft inputView von UITextField für Details.

+1

+1 für eine gute Antwort :) –