2011-11-02 22 views
11

Wiem, że zostało to wcześniej zadane, a jedyne odpowiedzi, jakie widziałem, to: "Nie wymagaj zewnętrznej klawiatury, ponieważ jest ona sprzeczna z wytycznymi interfejsu użytkownika". Jednak chcę użyć pedału nożnego w ten sposób: http://www.bilila.com/page_turner_for_ipad, aby przełączać się między stronami w mojej aplikacji (oprócz przesuwania). Ta strona tokarka emuluje klawiaturę i używa klawiszy strzałek w górę/w dół.Jak mogę odpowiedzieć na zewnętrzne klawisze strzałek na klawiaturze?

Oto moje pytanie: w jaki sposób mogę zareagować na te zdarzenia ze strzałkami? Musi być możliwe, jak zarządzają inne aplikacje, ale rysuję puste miejsce.

Odpowiedz

21

Dla tych, którzy szukają rozwiązania pod iOS 7 - istnieje nowa właściwość UIResponder o nazwie keyCommands. Utworzyć podklasę UITextView i wdrożenie keyCommands następująco ...

@implementation ArrowKeyTextView 

- (id) initWithFrame: (CGRect) frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
    } 
    return self; 
} 

- (NSArray *) keyCommands 
{ 
    UIKeyCommand *upArrow = [UIKeyCommand keyCommandWithInput: UIKeyInputUpArrow modifierFlags: 0 action: @selector(upArrow:)]; 
    UIKeyCommand *downArrow = [UIKeyCommand keyCommandWithInput: UIKeyInputDownArrow modifierFlags: 0 action: @selector(downArrow:)]; 
    UIKeyCommand *leftArrow = [UIKeyCommand keyCommandWithInput: UIKeyInputLeftArrow modifierFlags: 0 action: @selector(leftArrow:)]; 
    UIKeyCommand *rightArrow = [UIKeyCommand keyCommandWithInput: UIKeyInputRightArrow modifierFlags: 0 action: @selector(rightArrow:)]; 
    return [[NSArray alloc] initWithObjects: upArrow, downArrow, leftArrow, rightArrow, nil]; 
} 

- (void) upArrow: (UIKeyCommand *) keyCommand 
{ 

} 

- (void) downArrow: (UIKeyCommand *) keyCommand 
{ 

} 

- (void) leftArrow: (UIKeyCommand *) keyCommand 
{ 

} 

- (void) rightArrow: (UIKeyCommand *) keyCommand 
{ 

} 
+0

Czy to działa z 'UIWebView'? – Dmitry

+0

@Altaveron właściwość keyCommands jest właściwością obiektu UIResponder, a funkcja UIWebView dziedziczy po URIesponder, więc nie widzę powodu, dla którego nie będzie działać. – amergin

+0

'UIWebView' jest kontenerem dla wielu subviews. – Dmitry

9

Sortowane! Ja po prostu użyć widoku tekstu 1x1px i użyć metody delegata textViewDidChangeSelection:

EDIT: Dla iOS 6 musiałem zmienić widok tekstowy do 50x50px (lub przynajmniej na tyle, aby faktycznie wyświetlić tekst) to zadziałało

Udało mi się również wyłączyć klawiaturę ekranową po odłączeniu pedału.

To jest mój kod w viewDidLoad:

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

UITextView *hiddenTextView = [[UITextView alloc] initWithFrame:CGRectMake(0, 0, 50, 50)]; 
[hiddenTextView setHidden:YES]; 
hiddenTextView.text = @"aa"; 
hiddenTextView.delegate = self; 
hiddenTextView.selectedRange = NSMakeRange(1, 0); 
[self.view addSubview:hiddenTextView]; 

[hiddenTextView becomeFirstResponder]; 
if (keyboardShown) 
    [hiddenTextView resignFirstResponder]; 

keyboardShown jest zadeklarowana jako bool w moim pliku nagłówka.

Następnie dodać te metody:

- (void)textViewDidChangeSelection:(UITextView *)textView { 

    /******TEXT FIELD CARET CHANGED******/ 

    if (textView.selectedRange.location == 2) { 

     // End of text - down arrow pressed 
     textView.selectedRange = NSMakeRange(1, 0); 

    } else if (textView.selectedRange.location == 0) { 

     // Beginning of text - up arrow pressed 
     textView.selectedRange = NSMakeRange(1, 0); 

    } 

    // Check if text has changed and replace with original 
    if (![textView.text isEqualToString:@"aa"]) 
     textView.text = @"aa"; 
} 

- (void)keyboardWillAppear:(NSNotification *)aNotification { 
    keyboardShown = YES; 
} 

- (void)keyboardWillDisappear:(NSNotification *)aNotification { 
    keyboardShown = NO; 
} 

Mam nadzieję, że ten kod pomaga kogoś, kto szuka rozwiązania tego problemu. Zapraszam do korzystania z niego.

+1

Pracował wielki dla mnie, ale musiałem umieścić kod inicjalizacji w viewDidAppear nie viewDidLoad. – Bryan

+2

Myślę, że to prowadzi do nieskończonej pętli, ponieważ ustawienie właściwości 'selectedRange' (w' textViewDidChangeSelection') wyzwala kolejną 'textViewDidChangeSelection', chociaż ten pomysł naprawdę mi pomógł. –

+0

Nie spowoduje to nieskończonej pętli, ponieważ 'selectedRange' jest ustawiane tylko wtedy, gdy lokalizacja kursora wynosi 0 lub 2. – colincameron

Powiązane problemy