Je dois vérifier la condition de visibilité du clavier dans mon application iOS.
Pseudocode:
if(keyboardIsPresentOnWindow) {
//Do action 1
}
else if (keyboardIsNotPresentOnWindow) {
//Do action 2
}
Comment puis-je vérifier cette condition?
ios
objective-c
keyboard
Jitendra Singh
la source
la source
Réponses:
… Ou prenez la voie la plus simple:
Lorsque vous entrez un textField, il devient le premier répondeur et le clavier apparaît. Vous pouvez vérifier l'état du clavier avec
[myTextField isFirstResponder]
. S'il revientYES
, alors le clavier est actif.la source
Le code de drawonward est très proche, mais entre en collision avec l'espace de noms d'UIKit et pourrait être rendu plus facile à utiliser.
la source
+load
est une méthode spéciale appelée par le runtime Objective-C. Il est appelé pour chaque classe après le chargement du binaire de l'application, mais avant l'main()
entrée de la fonction. Il n'y a aucune garantie qu'une piscine autorelease sera active.NSAutoreleasePool
alloc
/release
peut maintenant être remplacé en entourant le code dans@autoreleasepool { }
Créez un
UIKeyboardListener
lorsque vous savez que le clavier n'est pas visible, par exemple en appelant[UIKeyboardListener shared]
depuisapplicationDidFinishLaunching
.la source
+(void)load
pour appeler init sur cette classe d'écouteur afin qu'il fonctionne de manière générique comme un glisser-déposer dans n'importe quel projet et s'initialise à partir du deuxième lancement d'application plutôt que de vous rappeler de l'initier n'importe où.Je pense que vous devez utiliser les notifications fournies sur le clavier:
De: http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UITextField_Class/Reference/UITextField.html
la source
Implémentation Swift 3
la source
Utiliser la hiérarchie des sous-vues de la fenêtre comme indication pour l'affichage du clavier est un hack. Si Apple modifiait sa mise en œuvre sous-jacente, toutes ces réponses seraient rompues.
La bonne façon serait de surveiller l'affichage du clavier et de masquer les notifications à l'échelle de l'application, par exemple à l'intérieur de votre délégué d'application:
Dans AppDelegate.h:
Dans AppDelegate.m:
Ensuite, vous pouvez vérifier en utilisant:
Il convient de noter que les notifications d'affichage / masquage du clavier ne se déclenchent pas lorsque l'utilisateur utilise un clavier Bluetooth ou externe.
la source
Ajouter une extension
Vérifiez ensuite si le clavier est présent,
la source
guard let keyboardWindowClass = NSClassFromString("UIRemoteKeyboardWindow") else { return false }; return UIApplication.shared.windows.contains(where: { $0.isKind(of: keyboardWindowClass) })
Ceci provient du guide de programmation texte iOS publié par Apple ici: https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/KeyboardManagement/KeyboardManagement.html
Appelez essentiellement "registerForKeyBoardNotifications" dans votre ViewDidLoad. Ensuite, chaque fois que le clavier devient actif, "keyboardWasShown" est appelé. Et chaque fois que le clavier disparaît, "keyboardWillBeHidden" est appelé.
la source
Maintenant, dans iOS8, cette solution ne fonctionne bien sûr pas. Il a été initialement écrit pour IOS4 / 5.
Essayez cette solution:
la source
Quelques observations:
Le modèle recommandé pour un objet singleton serait le suivant. dispatch_once s'assure que la classe est initialisée une fois de manière thread-safe et que la variable statique n'est pas visible à l'extérieur. Et c'est un GCD standard, donc pas besoin de connaître les détails de bas niveau d'Objective-C.
Habituellement, vous ne voulez pas savoir si le clavier est visible ou non, mais quelle est sa taille. Les claviers n'ont pas tous la même taille. Les claviers iPhone sont plus petits que les claviers iPad. Vous voudriez donc une autre propriété
@property (readonly, nonatomic) CGRect keyboardRect;
définie dans la méthode noticeShowKeyboard: comme celle-ci:Il est important de noter que le rectangle est en coordonnées UIWindow et ne respecte pas la rotation de l'écran. Ainsi, l'appelant convertirait ce rectangle en appelant
Si l'utilisateur fait pivoter l'écran alors que le clavier est visible, l'application sera informée que le clavier est masqué, puis affichée à nouveau. Lorsqu'il est affiché, les autres vues ne sont probablement pas encore pivotées. Donc, si vous observez vous-même les événements de masquage / affichage du clavier, convertissez les coordonnées lorsque vous en avez réellement besoin, pas dans la notification.
Si l'utilisateur divise ou déverrouille le clavier, ou utilise un clavier matériel, les notifications afficheront toujours le clavier comme masqué. Le désancrage ou la fusion du clavier enverra une notification «clavier affiché».
L'auditeur doit être initialisé alors que le clavier est masqué, sinon la première notification sera manquée, et on supposera que le clavier est masqué quand ce n'est pas le cas.
Il est donc très important de savoir ce que vous voulez réellement. Ce code est utile pour déplacer les choses hors du chemin du clavier (avec un clavier partagé ou non ancré, c'est la responsabilité de l'utilisateur). Il ne vous dit pas si l'utilisateur peut voir un clavier à l'écran (en cas de clavier partagé). Il ne vous dit pas si l'utilisateur peut taper (par exemple quand il y a un clavier matériel). Regarder d'autres fenêtres ne fonctionne pas si l'application crée elle-même d'autres fenêtres.
la source
Mise en œuvre rapide :
Étant donné que swift n'exécute pas la méthode de chargement de classe au démarrage, il est important de démarrer ce service au lancement de l'application:
la source
C'est ma solution, elle encapsule tout dans une seule méthode statique, et vous pouvez l'appeler n'importe où pour vérifier:
la source
Et voici comment le faire dans Swift:
N'oubliez pas de vous désinscrire:
Et si vous souhaitez fermer le clavier en appuyant sur le bouton "Retour":
la source
Essayez cette fonction
}
depuis: iOS: Comment accéder au `UIKeyboard`?
la source
BOOL isTxtOpen = [txtfieldObjct isFirstReponder]. S'il renvoie OUI, alors le clavier est actif.
la source
Pour vérifier que le clavier météo est apparu, nous pouvons utiliser les notifications prédéfinies du clavier.
UIKeyboardDidShowNotification, UIKeyboardDidHideNotification
Par exemple, je peux utiliser le code suivant pour écouter la notification du clavier
// Écoutez les apparitions et les disparitions au clavier
dans les méthodes, je peux recevoir des notifications
la source
Swift 4
la source
Vous pouvez vérifier de manière itérative toutes les vues de texte, les champs de texte et les étiquettes dans les sous-vues d'une vue parente pour voir si l'une d'entre elles est le premier répondant avec quelque chose comme ceci:
la source
SWIFT 4.2 / SWIFT 5
la source
Je pense que cela peut t'aider,
Merci,
Naveen Shan
la source