2011-10-20 10 views
15

Jak wielu z was wie, iOS 5 wprowadził gładką, podzieloną klawiaturę do pisania na klawiaturze. Niestety, mam trochę interfejsu użytkownika, który zależy od normalnego układu klawiatury na pełnym ekranie. Jeden z moich kontrolerów widoku wyświetla użytkownikowi arkusz wprowadzania tekstu, a jeśli kliknie w pole tekstowe, które będzie pokryte przez klawiaturę, przesunie się wraz z klawiaturą. Ta czynność nie jest konieczna w przypadku podzielonej klawiatury.Sprawdź podział klawiatury

Czy istnieje sposób sprawdzenia, który układ klawiatury jest używany, zanim się pojawi?

Dzięki!

+0

Doceniłby aktualizacji, w jaki sposób rozwiązać ten zabawie! –

+0

staram odpowiedź na to pytanie w [tutaj] [1] [1]: http://stackoverflow.com/a/17567217/887325 – Bimawa

Odpowiedz

17

Gdy klawiatura jest zadokowana, zostanie podniesiona UIKeyboardWillShowNotification. Jeśli klawiatura jest podzielona lub oddokowana, nie są zgłaszane żadne powiadomienia z klawiatury.

Jeśli klawiatura jest zadokowany, UIKeyboardWillShowNotification zostanie podniesiona, a dodaje się będą prawdziwe:

[[[notification userInfo] valueForKey:@"UIKeyboardFrameChangedByUserInteraction"] intValue] == 1 

Jeśli klawiatura jest odłączony, UIKeyboardWillHideNotification zostanie podniesiona, a powyższe stwierdzenie będzie również prawdziwe.

Wykorzystanie tych informacji było dla mnie wystarczające do zakodowania mojego interfejsu użytkownika.

Uwaga: może to być niezgodne z wytycznymi Apple, nie jestem pewien.

+0

wartość 'UIKeyboardFrameChangedByUserInteraction'is nie poprawne w iOS7 – Daniel

1

Powiadomienia są wysłane, kiedy pojawi się klawiatura lub zmienia swoją pozycję (UIKeyboardWillShowNotification, UIKeyboardWillChangeFrameNotification) zawierają słownika userInfo z ramą klawiatury (UIKeyboardFrameEndUserInfoKey), który pozwala na umieszczenie swoich elementów interfejsu poprawnie, w zależności od wielkości rzeczywistej i lokalizacja klawiatury.

5

UIKeyboardFrameChangedByUserInteraction Klucz nie zwraca 1 przez cały czas, gdy klawiatura dzieli.

Poniżej znajduje się pełne wartości słów kluczowych słownika użytkownika na UIKeyboardDidShowNotification/UIKeyboardDidHideNotification.

2012-07-11 11:52:44.701 Project[3856:707] keyboardDidShow: { 
    UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {1024, 352}}"; 
    UIKeyboardCenterBeginUserInfoKey = "NSPoint: {512, 944}"; 
    UIKeyboardCenterEndUserInfoKey = "NSPoint: {512, 592}"; 
    UIKeyboardFrameBeginUserInfoKey = "NSRect: {{-352, 0}, {352, 1024}}"; 
    UIKeyboardFrameChangedByUserInteraction = 0; 
    UIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 0}, {352, 1024}}"; 
} 

2012-07-11 11:52:45.675 Project[3856:707] keyboardDidHide: { 
    UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {1024, 352}}"; 
    UIKeyboardCenterBeginUserInfoKey = "NSPoint: {512, 592}"; 
    UIKeyboardCenterEndUserInfoKey = "NSPoint: {512, 944}"; 
    UIKeyboardFrameBeginUserInfoKey = "NSRect: {{0, 0}, {352, 1024}}"; 
    UIKeyboardFrameChangedByUserInteraction = 0; 
    UIKeyboardFrameEndUserInfoKey = "NSRect: {{-352, 0}, {352, 1024}}"; 
} 

Zamiast tego można użyć UIKeyboardCenterBeginUserInfoKey lub UIKeyboardCenterEndUserInfoKey klawiszy, aby otrzymywać powiadomienia, gdy podziały klawiaturowych.

Mam nadzieję, że to pomoże!

+5

_To działało dla mnie_ [iPad-Split-klawiatura i (brakujące) powiadomienia] (http://adevelopingstory.com/blog/2012/05/the-ipad-split-keyboard-and-missing-notifications.html), – Zeeshan

9

Jest to rozwiązanie, które współpracuje z iPad dzielonych klawiatur (pierwotnie z bloga połączonego w komentarzu Zeeshan'S)

[[NSNotificationCenter defaultCenter] 
    addObserverForName:UIKeyboardDidChangeFrameNotification 
    object:nil 
    queue:[NSOperationQueue mainQueue] 
    usingBlock:^(NSNotification * notification) 
{ 
    CGRect keyboardEndFrame = 
    [[notification.userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue]; 

    CGRect screenRect = [[UIScreen mainScreen] bounds]; 

    if (CGRectIntersectsRect(keyboardEndFrame, screenRect)) 
    { 
     // Keyboard is visible 
    } 
    else 
    { 
     // Keyboard is hidden 
    } 
}]; 
+1

Świetne , ale zamiast sprawdzać, czy klawiatura przecina ramkę bieżącego widoku, po prostu sprawdź, czy jest na ekranie: CGRect screenRect = [[UIScreen mainScreen] bounds]; if (CGRectIntersectsRect (keyboardEndFrame, screenRect)) ... –

+0

@MasonLee Zaktualizowany zgodnie z twoim komentarzem. Dzięki! – Robert