2011-01-10 8 views
55

Jak utworzyć niestandardową klawiaturę/klawiaturę, która pojawi się, gdy ktoś dotknie UITextField? Chciałbym wyświetlić klawiaturę z przyciskami a, b, c, 1, 2, 3 i klawiszem Enter, nic więcej. Klawiatura powinna działać i zachowywać się tak, jak robi to standardowa klawiatura (w zachowaniu), ale z pewnością będzie wyglądać inaczej.Tworzenie niestandardowej klawiatury

Nie mogę znaleźć żadnego przykładu, a najlepsze, jakie znalazłem, to filtrowanie znaków za pomocą istniejącej klawiatury, co jest niedopuszczalnym rozwiązaniem.

+0

Odpowiedziałem na bardzo podobne pytanie (link w mojej odpowiedzi poniżej: http://stackoverflow.com/a/13351686/937822), który tworzy niestandardową klawiaturę. Zrobiłem to open source i umieściłem na Githubu, aby wszyscy mogli go używać, a ostatnio dodałem przykład z sześciokąta. Jeśli chcesz tylko a-c i 1-3, po prostu musisz usunąć dodatkowe przyciski! – lnafziger

Odpowiedz

38

Myślę, że szukasz „Text, Web, and Editing Programming Guide for iOS

UIKit ram zawiera wsparcie dla niestandardowych widoków wejściowych i widoków pomocniczych wejściowego. Aplikacja może zastąpić własny widok wprowadzania klawiatury systemowej, gdy użytkownicy edytują tekst lub inne dane w widoku. Na przykład aplikacja może użyć niestandardowego widoku wejściowego do wprowadzenia znaków z alfabetu runicznego. Możesz także dołączyć widok akcesoriów wejściowych do klawiatury systemowej lub niestandardowego widoku wejściowego; ten widok akcesoriów biegnie u góry głównego widoku danych wejściowych i może zawierać na przykład formanty, które wpływają na tekst w jakiś sposób lub etykiety wyświetlające pewne informacje o tekście.

Aby uzyskać tę funkcję, jeśli aplikacja używa obiektów UITextView i UITextField do edycji tekstu, wystarczy przypisać niestandardowe widoki do właściwości inputView i inputAccessoryView. Te widoki niestandardowe są wyświetlane, gdy obiekt tekst staje się pierwszym responder ...


Może to służyć jako dobry wstęp: customizing the iOS keyboard

+1

Ten link jest w połowie pomocny. Mówi ci o tym, jak to możliwe, aby utworzyć niestandardową klawiaturę i jakie kategorie musi spełniać klasa akceptująca tekst, aby zaakceptować dane wejściowe z niestandardowej klawiatury ... ale nie mówi prawie nic o tym, jak budować niestandardowe sama klawiatura. Bardzo przydatne byłoby łącze do przykładowego kodu. –

+0

@Robert, masz rację. Nie znalazłem odpowiedzi i poddałem się. Daj mi znać, jeśli znajdziesz rozwiązanie. – HM1

+2

Połączyłem podstawowy przykład implementacji kilku przypadków, w których możesz chcieć dostosować widoki wejściowe, mam nadzieję, że to trochę pomoże. Zobacz zaktualizowaną odpowiedź. – Jonah

3

Przede wszystkim utworzyć widok (zrobiłem to w oddzielnym plik stalówka i załadowany to w ten sposób):

NSArray *views = [[NSBundle mainBundle] loadNibNamed:@"ReducedNumericKeyboardView" 
                owner:self 
               options:nil]; 
    keyBView = (ReducedNumericKeyboardView*)[views objectAtIndex:0]; 

Po nim, ustawić go jako widok wejścia do pola tekstowego, gdzie chcę go (w użyciu i faktycznie, jest to krótka odpowiedź na pytanie;)) :

[self.propertyEditor setInputView:keyBView]; 

po kliknięciu w pole i zrobić przewijać widok szczenię (jeśli to konieczne), aby nie pokrywać murawę:

CGRect textFieldRect = [self.tableViewController.view.window convertRect:propertyEditor.bounds fromView:propertyEditor]; 
CGRect viewRect = [self.tableViewController.view.window convertRect:self.tableViewController.view.bounds fromView:self.tableViewController.view]; 
CGFloat midLine = textFieldRect.origin.y+.5*textFieldRect.size.height; 

CGFloat numerator = midLine - viewRect.origin.y - MINIMUM_SCROLL_FRACTION*viewRect.size.height; 
CGFloat denominator = (MAXIMUM_SCROLL_FRACTION - MINIMUM_SCROLL_FRACTION)*viewRect.size.height; 
CGFloat heightFraction = MIN(1, MAX(0, numerator/denominator)); 

animateDistance = floor(PORTRAIT_USER_INPUT_VIEW_HEIGHT*heightFraction); 

CGRect viewFrame = self.tableViewController.view.frame; 
viewFrame.origin.y -= animateDistance; 
[UIView beginAnimations:nil context:NULL]; 
[UIView setAnimationBeginsFromCurrentState:YES]; 
[UIView setAnimationDuration:USER_INPUT_ANIMATION_DURATION]; 
[self.tableViewController.view setFrame:viewFrame]; 
[UIView commitAnimations]; 

Podczas edycji zakończeniu zrobić przewinąć widok w dół:

 CGRect viewFrame = self.tableViewController.view.frame; 
     viewFrame.origin.y += animateDistance; 
     [UIView beginAnimations:nil context:NULL]; 
     [UIView setAnimationBeginsFromCurrentState:YES]; 
     [UIView setAnimationDuration:USER_INPUT_ANIMATION_DURATION]; 
     [self.tableViewController.view setFrame:viewFrame]; 
     [UIView commitAnimations]; 

ograniczenia używam są ustawione w następujący sposób:

static const CGFloat USER_INPUT_ANIMATION_DURATION = 0.3; 
static const CGFloat PORTRAIT_USER_INPUT_VIEW_HEIGHT = 180; 

static const CGFloat MINIMUM_SCROLL_FRACTION = 0.1; 
static const CGFloat MAXIMUM_SCROLL_FRACTION = 0.2; 
+0

Poprosi Cię o jakiekolwiek ulepszenie tego pytania, ponieważ niektórzy z was przeprowadzili badania (i mogli znaleźć rozwiązanie), proszę napisać, jeśli znalazłeś coś użytecznego .... –

2

Niestety, wspomniany powyżej "Podręcznik programowania, strony WWW i edycji do systemu iOS" nie zawiera żadnych informacji o tym, co zrobić z tym znakiem po naciśnięciu klawisza. Jest to zdecydowanie trudna sprawa podczas implementacji klawiatury w systemie iOS.

Stworzyłem pełną przykład roboczym numberpad hex, które mogą być łatwo dostosowane do jak trzeba.

Szczegółowe dane znajdują się w innej mojej odpowiedzi na ten temat: https://stackoverflow.com/a/13351686/937822

2

Chcesz ustawić wartość dla

inputView 

na swojej UITextField. Będziesz musiał w pełni wdrożyć nową klawiaturę lub mechanizm wejściowy w widoku, który podasz.

Alternatywnie

inputAccessoryView 

mogą być wykorzystane, aby dodać niewielką ilość funkcjonalności. Widok zostanie umieszczony nad klawiaturą systemową i pojawi się i zostanie z nim usunięty.

Powiązane problemy