Muszę sprawdzić stan widoczności klawiatury w mojej aplikacji na iOS.
Pseudo kod:
if(keyboardIsPresentOnWindow) {
//Do action 1
}
else if (keyboardIsNotPresentOnWindow) {
//Do action 2
}
Jak mogę sprawdzić ten stan?
ios
objective-c
keyboard
Jitendra Singh
źródło
źródło
Odpowiedzi:
… Lub na łatwiznę:
Po wprowadzeniu pola textField staje się ono pierwszą osobą odpowiadającą i pojawia się klawiatura. Możesz sprawdzić stan klawiatury za pomocą
[myTextField isFirstResponder]
. Jeśli powróciYES
, klawiatura jest aktywna.źródło
Kod drawonward jest bardzo zbliżony, ale koliduje z przestrzenią nazw UIKit i może być łatwiejszy w użyciu.
źródło
+load
to specjalna metoda wywoływana przez środowisko wykonawcze Objective-C. Jest wywoływana dla każdej klasy po załadowaniu pliku binarnego aplikacji, ale przed wprowadzeniemmain()
funkcji. Nie ma gwarancji, że pula autowydzielania będzie dostępna.NSAutoreleasePool
alloc
/release
może być teraz zastąpiona przez otaczający kod@autoreleasepool { }
Utwórz,
UIKeyboardListener
gdy wiesz, że klawiatura nie jest widoczna, na przykład dzwoniąc[UIKeyboardListener shared]
zapplicationDidFinishLaunching
.źródło
+(void)load
do wywołania init w tej klasie nasłuchiwania, aby generalnie działał jako przeciągnij i upuść do dowolnego projektu i zainicjował z drugiego uruchomienia aplikacji, zamiast pamiętać o zainicjowaniu go w dowolnym miejscu.Myślę, że musisz skorzystać z powiadomień, które są dostarczane na temat klawiatury:
Od: http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UITextField_Class/Reference/UITextField.html
źródło
Wdrożenie Swift 3
źródło
Używanie hierarchii widoku podrzędnego okna jako wskazania do wyświetlania klawiatury to hack. Jeśli Apple zmieni ich podstawową implementację, wszystkie te odpowiedzi się zepsują.
Prawidłowym sposobem byłoby monitorowanie klawiatury, pokazywanie i ukrywanie aplikacji powiadomień w całej aplikacji, na przykład w delegacie aplikacji:
W AppDelegate.h:
W AppDelegate.m:
Następnie możesz sprawdzić za pomocą:
Należy zauważyć, że powiadomienia pokazywania / ukrywania klawiatury nie będą uruchamiane, gdy użytkownik korzysta z bluetooth lub klawiatury zewnętrznej.
źródło
Dodaj rozszerzenie
Następnie sprawdź, czy klawiatura jest obecna,
źródło
guard let keyboardWindowClass = NSClassFromString("UIRemoteKeyboardWindow") else { return false }; return UIApplication.shared.windows.contains(where: { $0.isKind(of: keyboardWindowClass) })
Pochodzi z podręcznika programowania tekstowego iOS opublikowanego przez Apple tutaj: https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/KeyboardManagement/KeyboardManagement.html
Zasadniczo wywołaj „registerForKeyBoardNotifications” w swoim ViewDidLoad. Następnie za każdym razem, gdy klawiatura staje się aktywna, wywoływana jest funkcja „keyboardWasShown”. Za każdym razem, gdy klawiatura znika, wywoływana jest funkcja „keyboardWillBeHidden”.
źródło
Teraz w iOS8 to rozwiązanie oczywiście nie działa. Został napisany początkowo dla IOS4 / 5.
Wypróbuj to rozwiązanie:
źródło
Kilka uwag:
Zalecany wzorzec dla pojedynczego obiektu byłby następujący. dispatch_once zapewnia, że klasa jest inicjowana raz w sposób bezpieczny dla wątków, a zmienna statyczna nie jest widoczna na zewnątrz. Jest to standardowe GCD, więc nie trzeba znać szczegółów niskiego poziomu Objective-C.
Zwykle nie chcesz wiedzieć, czy klawiatura jest widoczna, czy nie, ale jaka jest. Nie wszystkie klawiatury mają ten sam rozmiar. Klawiatury iPhone'a są mniejsze niż klawiatury iPada. Więc chciałbyś mieć inną właściwość,
@property (readonly, nonatomic) CGRect keyboardRect;
która jest ustawiona w metodzie noticeShowKeyboard: jak ta:Należy zauważyć, że prostokąt ma współrzędne UIWindow i nie uwzględnia obrotu ekranu. Więc dzwoniący konwertuje ten prostokąt, wywołując
Jeśli użytkownik obróci ekran, gdy klawiatura jest widoczna, aplikacja zostanie poinformowana, że klawiatura jest ukryta, a następnie zostanie wyświetlona ponownie. Gdy jest wyświetlany, najprawdopodobniej inne widoki nie są jeszcze obracane. Jeśli więc sam obserwujesz zdarzenia ukrywania / pokazywania klawiatury, przekonwertuj współrzędne, gdy faktycznie ich potrzebujesz, a nie w powiadomieniu.
Jeśli użytkownik podzieli lub oddokuje klawiaturę albo użyje klawiatury sprzętowej, w powiadomieniach będzie zawsze wyświetlana klawiatura jako ukryta. Oddokowanie lub połączenie klawiatury spowoduje wysłanie powiadomienia „wyświetlono klawiaturę”.
Odbiornik musi zostać zainicjowany, gdy klawiatura jest ukryta, w przeciwnym razie pierwsze powiadomienie zostanie pominięte i zostanie przyjęte, że klawiatura jest ukryta, gdy nie jest.
Dlatego bardzo ważne jest, aby wiedzieć, czego naprawdę chcesz. Ten kod jest przydatny, aby usunąć elementy z drogi klawiatury (w przypadku klawiatury podzielonej lub niezadokowanej, za to odpowiada użytkownik). Nie informuje, czy użytkownik widzi klawiaturę na ekranie (w przypadku klawiatury podzielonej). Nie informuje, czy użytkownik może pisać (na przykład, gdy jest klawiatura sprzętowa). Przeglądanie innych okien nie działa, jeśli aplikacja sama tworzy inne okna.
źródło
Szybka realizacja:
Ponieważ swift nie wykonuje metody ładowania klas podczas uruchamiania, ważne jest, aby uruchomić tę usługę podczas uruchamiania aplikacji:
źródło
To jest moje rozwiązanie, zawiera wszystko w jednej statycznej metodzie i możesz ją wywołać w dowolnym miejscu, aby sprawdzić:
źródło
A oto jak to zrobić w Swift:
Nie zapomnij wyrejestrować się:
A jeśli chcesz zamknąć klawiaturę po naciśnięciu przycisku „Return”:
źródło
Wypróbuj tę funkcję
}
from: iOS: Jak uzyskać dostęp do `UIKeyboard`?
źródło
BOOL isTxtOpen = [txtfieldObjct isFirstReponder]. Jeśli zwraca TAK, klawiatura jest aktywna.
źródło
Aby sprawdzić, czy pojawiła się klawiatura pogodowa, możemy skorzystać z powiadomień predefiniowanych Klawiatura.
UIKeyboardDidShowNotification, UIKeyboardDidHideNotification
Na przykład mogę użyć następującego kodu, aby odsłuchać powiadomienie z klawiatury
// Nasłuchuj pojawiania się i znikania klawiatury
w metodach mogę otrzymywać powiadomienia
źródło
Szybki 4
źródło
Możesz iteracyjnie sprawdzić wszystkie widoki tekstu, pola tekstowe i etykiety w widokach podrzędnych widoku nadrzędnego, aby zobaczyć, czy któryś z nich jest pierwszym respondentem z czymś takim:
źródło
SWIFT 4.2 / SWIFT 5
źródło
Myślę, że to może ci pomóc,
dzięki,
Naveen Shan
źródło