Couvre clavier iPhone UITextField

120

J'ai une application où, dans Interface Builder , j'ai configuré une UIViewqui a un champ de texte près du bas de la vue. Lorsque j'exécute l'application et que j'essaie de saisir du texte dans ce champ, le clavier glisse au-dessus du champ afin que je ne puisse pas voir ce que je saisis jusqu'à ce que je masque à nouveau le clavier.

Quelqu'un d'autre a-t-il rencontré ce problème et trouvé un bon moyen de le résoudre sans faire défiler la vue parent ou déplacer le champ de texte plus haut sur l'écran?

Cruinh
la source
Reproduction
Ratul Sharker

Réponses:

290

La solution habituelle consiste à faire glisser le champ (et tout ce qui se trouve au-dessus) vers le haut avec une animation, puis à reculer lorsque vous avez terminé. Vous devrez peut-être placer le champ de texte et certains des autres éléments dans une autre vue et faire glisser la vue comme une unité. (J'appelle ces choses "plaques" comme dans "plaques tectoniques", mais ce n'est que moi). Mais voici l'idée générale si vous n'avez pas besoin d'être sophistiqué.

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    [self animateTextField: textField up: YES];
}


- (void)textFieldDidEndEditing:(UITextField *)textField
{
    [self animateTextField: textField up: NO];
}

- (void) animateTextField: (UITextField*) textField up: (BOOL) up
{
    const int movementDistance = 80; // tweak as needed
    const float movementDuration = 0.3f; // tweak as needed

    int movement = (up ? -movementDistance : movementDistance);

    [UIView beginAnimations: @"anim" context: nil];
    [UIView setAnimationBeginsFromCurrentState: YES];
    [UIView setAnimationDuration: movementDuration];
    self.view.frame = CGRectOffset(self.view.frame, 0, movement);
    [UIView commitAnimations];
}
Amagrammer
la source
12
J'adore que vous n'ayez pas publié de lien vers le code, mais le code lui-même.
Ben Coffman
2
Bon bout de code. Je n'ai pas eu à le modifier pour que cela fonctionne ou quoi que ce soit. Merci ~
James
5
Il est utile de couvrir tout l'écran comme ci-dessous: const int movementDistance = textField.frame.origin.y / 2; // ajustez au besoin
conecon
3
Je dois mentionner que "Si vous écrivez une application pour iOS 4 ou version ultérieure, vous devez utiliser les méthodes basées sur des blocs pour animer votre contenu à la place." Référencé de: developer.apple.com/library/ios/#documentation/windowsviews/...
Mathieu
1
Trouvé ceci et il traite du même problème developer.apple.com/Library/ios/documentation/StringsTextFonts
...
38

Cela a fonctionné à merveille pour moi en glissant des uitextfields

En particulier, il a l'avantage de calculer la distance d'animation de la diapositive en fonction de la position du champ de texte.

cédé
la source
C'est bien. Vous n'avez pas à choisir une constante de «distance de déplacement» pour chaque champ de texte - elle est calculée pour vous.
jlstrecker
La meilleure solution de loin. Mécanisme phénoménal!
Marchy
1
Fonctionne très bien sur l'iPad aussi. Je viens de mettre à jour PORTRAIT_KEYBOARD_HEIGHT = 264 et LANDSCAPE_KEYBOARD_HEIGHT = 352. Excellent lien. Merci.
Khon Lieu
Le lien ci-dessus vient de faire ma journée! Si simple à mettre en œuvre, fonctionne parfaitement jusqu'à présent!
JimmyJammed
1
C'est la meilleure explication sur ce sujet. D'autres didacticiels utilisent des vues de table, des vues de défilement, etc. Cela fonctionne réellement sans entrer dans aucune autre complexité, pure et simple. Merci d'avoir partagé cette source.
Renexandro
28

IQKeyboardManager le fait pour vous sans LIGNE DE CODE , il suffit de faire glisser et déposer le fichier source associé au projet. IQKeyboardManager prend également en charge l' orientation des périphériques , la gestion automatique de la barre d'outils UIT , keyboardDistanceFromTextField et bien plus que vous ne le pensez.

entrez la description de l'image ici

Voici l'organigramme de contrôle: Organigramme de contrôle

Etape 1: - les notifications globales Ajout de UITextField, UITextViewet UIKeyboarddans une classe singleton. Je l'ai appelé IQKeyboardManager .

Étape 2: - Si trouvé UIKeyboardWillShowNotification, UITextFieldTextDidBeginEditingNotificationou des UITextViewTextDidBeginEditingNotificationnotifications, essayez d'obtenir une topMostViewControllerinstance de la UIWindow.rootViewControllerhiérarchie. Afin de bien découvrir UITextField/ UITextViewsur celui-ci, topMostViewController.viewle cadre de s doit être ajusté.

Étape 3: - Distance de déplacement prévue calculée topMostViewController.viewpar rapport à la première réponse UITextField/ UITextView.

Étape 4: - Déplacé topMostViewController.view.framevers le haut / vers le bas en fonction de la distance de déplacement attendue.

Étape 5: - Si trouvé UIKeyboardWillHideNotification, UITextFieldTextDidEndEditingNotificationou UITextViewTextDidEndEditingNotificationnotification, essayez à nouveau d'obtenir une topMostViewControllerinstance de la UIWindow.rootViewControllerhiérarchie.

Étape 6: - Distance perturbée calculée topMostViewController.viewdont il faut restaurer sa position d'origine.

Étape 7: - Rétabli topMostViewController.view.frameen fonction de la distance perturbée.

Étape 8: - Instance de classe IQKeyboardManager singleton instanciée lors du chargement de l'application, de sorte que chaque UITextField/ UITextViewdans l'application s'ajuste automatiquement en fonction de la distance de déplacement attendue.

C'est tout

Mohd Iftekhar Qurashi
la source
La réponse acceptée ne fonctionnait pas pour moi. Mais celui-ci le fait.
apprenant
@ZaEeMZaFaR IQKeyboardManager est également optimisé pour iPad. Pouvez-vous s'il vous plaît ouvrir un problème sur le dépôt github de la bibliothèque et télécharger un projet de démonstration illustrant le problème avec l'iPad?
Mohd Iftekhar Qurashi
Merci pour votre réponse. Je le ferai si le problème persiste, avant de commenter, je pensais que IQKeyboardManager n'est pas destiné à un appareil universel.
ZaEeM ZaFaR
En enquêtant davantage, cela fonctionne bien avec l'iPad sur un simulateur, mais pas sur un appareil iPad réel. Fonctionne parfaitement bien sur iPhone également (appareil + simulateur). Quel pourrait être le problème?
ZaEeM ZaFaR
Comme je l'ai déjà dit, vous devriez soulever un problème sur le dépôt github avec le projet de démonstration avec les détails de votre iOS et de la version de votre appareil, afin que nous puissions examiner le problème.
Mohd Iftekhar Qurashi
7

Pour développer la réponse d'Amagrammer, voici un exemple de classe:

LoginViewController.h

@interface LoginViewController : UIViewController <UITextFieldDelegate> {

}

@property (nonatomic, retain) IBOutlet UITextField    *emailTextField;
@property (nonatomic, retain) IBOutlet UITextField    *passwordTextField;

Notez que nous implémentons le "UITextFieldDelegate"

LoginViewController.m

@implementation LoginViewController
@synthesize emailTextField=_emailTextField;
@synthesize passwordTextField=_passwordTextField;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        //Register to receive an update when the app goes into the backround
        //It will call our "appEnteredBackground method
        [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(appEnteredBackground)
                                                 name:UIApplicationDidEnterBackgroundNotification
                                               object:nil];
    }
    return self;
}


- (void) animateTextField: (UITextField*) textField up: (BOOL) up
{
    const int movementDistance = 80; // tweak as needed
    const float movementDuration = 0.3f; // tweak as needed

    int movement = (up ? -movementDistance : movementDistance);

    [UIView beginAnimations: @"anim" context: nil];
    [UIView setAnimationBeginsFromCurrentState: YES];
    [UIView setAnimationDuration: movementDuration];
    self.view.frame = CGRectOffset(self.view.frame, 0, movement);
    [UIView commitAnimations];
}

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    [self animateTextField: textField up: YES];
}


- (void)textFieldDidEndEditing:(UITextField *)textField
{
    [self animateTextField: textField up: NO];
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}
//This is called when the app goes into the background.
//We must reset the responder because animations will not be saved
- (void)appEnteredBackground{
    [self.emailTextField resignFirstResponder];
    [self.passwordTextField resignFirstResponder];
}
stebooks
la source
+1 pour mentionner UIApplicationDidEnterBackgroundNotification, sinon il se déplacera plus vers le bas si vous appuyez sur le bouton Accueil et revenez dans l'application, la rendant moche et boguée.
Adil Soomro
7

Que diriez-vous de la solution officielle: déplacer le contenu situé sous le clavier

L'ajustement de votre contenu implique généralement de redimensionner temporairement une ou plusieurs vues et de les positionner de sorte que l'objet texte reste visible. Le moyen le plus simple de gérer des objets texte avec le clavier consiste à les incorporer dans un objet UIScrollView (ou dans l'une de ses sous-classes comme UITableView). Lorsque le clavier est affiché, tout ce que vous avez à faire est de réinitialiser la zone de contenu de la vue de défilement et de faire défiler l'objet texte souhaité en position. Ainsi, en réponse à une UIKeyboardDidShowNotification, votre méthode de gestionnaire ferait ce qui suit:

  1. Obtenez la taille du clavier.
  2. Ajustez l'encart de contenu inférieur de votre vue de défilement par la hauteur du clavier.
  3. Faites défiler le champ de texte cible dans la vue.
// Call this method somewhere in your view controller setup code.
- (void)registerForKeyboardNotifications
{
    [[NSNotificationCenter defaultCenter] addObserver:self
            selector:@selector(keyboardWasShown:)
            name:UIKeyboardDidShowNotification object:nil];

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

}

// Called when the UIKeyboardDidShowNotification is sent.
- (void)keyboardWasShown:(NSNotification*)aNotification
{
    NSDictionary* info = [aNotification userInfo];
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

    UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 0.0);
    scrollView.contentInset = contentInsets;
    scrollView.scrollIndicatorInsets = contentInsets;

    // If active text field is hidden by keyboard, scroll it so it's visible
    // Your app might not need or want this behavior.
    CGRect aRect = self.view.frame;
    aRect.size.height -= kbSize.height;
    if (!CGRectContainsPoint(aRect, activeField.frame.origin) ) {
        [self.scrollView scrollRectToVisible:activeField.frame animated:YES];
    }
}

// Called when the UIKeyboardWillHideNotification is sent
- (void)keyboardWillBeHidden:(NSNotification*)aNotification
{
    UIEdgeInsets contentInsets = UIEdgeInsetsZero;
    scrollView.contentInset = contentInsets;
    scrollView.scrollIndicatorInsets = contentInsets;
}
Mars
la source
Cette solution officielle est maintenant enveloppée dans un contrôle voir ici: - stackoverflow.com/a/17707094/1582217
Mohd Iftekhar Qurashi
L'idée est bonne, mais la propriété 'contentInset' n'aide pas ici, coz contentInset vous fournira simplement l'effet de remplissage: stackoverflow.com/a/10049782/260665
Raj Pawan Gumdal
@Raj, C'est peut-être le cas que je peux consulter sur IQKeyboardManager, mais personne n'a encore ouvert de problème sur le référentiel github officiel IQKeyboardManager concernant le problème de propriété contentInset, donc je suppose que cela fonctionne.
Mohd Iftekhar Qurashi
7

J'ai rencontré le même problème dans les UITableView cellules textField. Je résous ce problème en implémentant la méthode suivante pour écouter la notification du clavier.

Observateur pour les notifications ici:

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

Gérez ces notifications en utilisant la fonction ci-dessous:

(void)keyboardWasShown:(NSNotification*)aNotification 
(void)keyboardWillBeHidden:(NSNotification*)aNotification 
Boobalan
la source
1
Le lien est rompu. Veuillez envisager d'inclure une solution indépendante à l'avenir!
miek
5

Regarde ça. Pas de soucis pour vous.

Cette solution est très soignée. Tout ce que vous avez à faire est d'ajouter vos champs de texte dans un UIScrollViewet de changer sa classe en TPKeyboardAvoidingScollView, si vous utilisez des storyboards. La vue de défilement est étendue de manière à détecter le moment où le clavier est visible et à se déplacer au-dessus du clavier à une distance raisonnable. C'est la solution parfaite car elle est indépendante de la vôtre UIViewController. Chaque chose nécessaire est faite dans la classe mentionnée ci-dessus. Merci Michael Tyson et tous.

TPKeyboardÉvitement

Aruna
la source
@NANNAV - Veuillez fournir des commentaires lorsque vous faites des suggestions pour modifier une réponse.
Security Hound
5

Voici une version rapide de la réponse d'Amagrammer. Aussi, une variation utilisant l'événement UIKeyboardWillShowNotification car j'avais besoin de connaître la taille des claviers avant de déplacer la vue.

var keyboardHeight:CGFloat = 0

override func viewDidLoad() {
    super.viewDidLoad()
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillChange:", name: UIKeyboardWillShowNotification, object: nil)
}

func textFieldDidBeginEditing(textField: UITextField) {
    //keyboardWillChange (below) is used instead of textFieldDidBeginEditing because textFieldDidBeginEditing
    //is called before the UIKeyboardWillShowNotification necessary to determine the keyboard height.
}

func textFieldDidEndEditing(textField: UITextField) {
    animateTextField(false)
}

func animateTextField(textFieldUp:Bool) {
    let movementDistance:CGFloat = keyboardHeight
    let movementDuration = 0.3

    let movement:CGFloat = (textFieldUp ? -movementDistance : movementDistance)

    UIView.beginAnimations("anim", context: nil)
    UIView.setAnimationBeginsFromCurrentState(true)
    UIView.setAnimationDuration(movementDuration)
    self.view.frame = CGRectOffset(self.view.frame, 0, movement)
    UIView.commitAnimations()
}

func keyboardWillChange(notification:NSNotification) {
    let keyboardRect:CGRect = ((notification.userInfo![UIKeyboardFrameEndUserInfoKey])?.CGRectValue)!
    keyboardHeight = keyboardRect.height
    animateTextField(true)
}
Justin Domnitz
la source
4

Il y a eu une grande procédure pas à pas pour éditer les champs de texte sans obscurcir (lien mort maintenant, voici un lien Wayback: https://web.archive.org/web/20091123074029/http://acts-as-geek.blogspot.com/2009/ 11 / edit-textfields-without-obscuring.html ). Il montre comment déplacer un existant UIViewsur un UIScrollView, et le faire défiler automatiquement lorsque le clavier apparaît.

Je l'ai mis à jour un peu pour calculer la hauteur correcte pour le UIScrollViewquand il y a des contrôles (tels que a UITabBar) sous le UIScrollBar. Voir l' article mettant à jour uiview .

GargantuChet
la source
2

Voici une solution utilisant Xcode5, iOS7:

Utilisez les blocs UITextfieldDelegate et animation.

C'est presque tout le code du ViewController, mais je voulais inclure le code du délégué pour ceux qui ne connaissent pas encore le modèle de délégué (comme moi). J'ai également inclus un code pour masquer le clavier lorsque vous appuyez loin de la vue de texte.

Vous pouvez déplacer les vues (boutons, champs de texte, etc.) aussi haut que vous le souhaitez, assurez-vous simplement de les remettre en place (+100 puis plus tard -100).

@interface ViewController () <UITextFieldDelegate>
@property (strong, nonatomic) IBOutlet UITextField *MyTextField;

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.MyTextField.delegate = self;

}

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
      NSLog(@"text began editing");

      CGPoint MyPoint = self.MyTextField.center;

      [UIView animateWithDuration:0.3
                    animations:^{

                    self.MyTextField.center = CGPointMake(MyPoint.x, MyPoint.y - 100);
                                }];
}

- (void)textFieldDidEndEditing:(UITextField *)textField
{
     NSLog(@"text ENDED editing");

     CGPoint MyPoint = self.MyTextField.center;

     [UIView animateWithDuration:0.3
                 animations:^{

     self.MyTextField.center = CGPointMake(MyPoint.x, MyPoint.y + 100);
                             }];
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
     [self.view endEditing:YES];
}
Ethan Parker
la source
1

Je suppose qu'une façon serait de déplacer toute la position de votre vue de (x, y) à (x, y-keybaardHeight) lorsque le champ de texte est cliqué et de le remettre lorsque le clavier est ignoré, cela peut sembler un peu étrange car la vue est juste apparaît (peut-être que ce ne serait pas mal si vous l'animiez).

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    CGRect frame=self.view.frame;
    frame.origin=CGPointMake(x...//set point here
    self.view.frame=frame;
}
Daniel
la source
Non ce n'est pas. Si l'utilisateur appuie sur le premier champ de texte, il passera au-dessus de la zone visible.
lolol
0

En plus de la solution d'Amagrammer, si vous utilisez cocos2d en mode portrait, changez cette ligne:

self.view.frame = CGRectOffset(self.view.frame, 0, movement);

pour ça:

[CCDirector sharedDirector].openGLView.frame = CGRectOffset([CCDirector sharedDirector].openGLView.frame, movement, 0);

Si vous utilisez cocos2d en mode paysage, effectuez la modification ci-dessus et changez les upvaleurs entre textFieldDidBeginEditing:ettextFieldDidEndEditing:

- (void)textFieldDidBeginEditing:(UITextField *)textField {
    [self animateTextField:textField up:NO];
}

- (void)textFieldDidEndEditing:(UITextField *)textField {
    [self animateTextField:textField up:YES];
}
Iron Mike
la source
0

J'ai eu le même problème et j'ai trouvé que GTKeyboardHelper était une solution facile.

Après avoir fait glisser et déposer le framework dans votre projet, incluez le fichier d'en-tête. Téléchargez et ouvrez l'exemple de projet, puis faites glisser l'objet "Keyboard Helper" de la section des objets dans le xib vers la section des objets dans le générateur d'interface de votre projet.

Faites glisser et déposez toutes vos vues pour être des enfants de "Keyboard Helper".

Andrei Nagy
la source
0

Glisser-déposer le framework que j'utilise dans mes projets. Prend en charge le rejet automatique lorsque vous appuyez en dehors d'un premier répondeur ou lorsque vous faites défiler.

GTKeyboardHelper

mackross
la source
0

Faites simplement glisser la vue de haut en bas au besoin:

- (void)textFieldDidEndEditing:(UITextField *)textField {
    self.currentTextField = nil;
    [self animateTextField: textField up: NO];
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    [self.currentTextField resignFirstResponder];
    return YES;
}

- (void) animateTextField:(UITextField*) textField up:(BOOL)up {
    const int movementDistance = 80; // tweak as needed
    const float movementDuration = 0.3f; // tweak as needed

    int movement = (up ? -movementDistance : movementDistance);

    [UIView animateWithDuration:movementDuration animations:^{
        self.view.frame = CGRectOffset(self.view.frame, 0, movement);
    }];
}

N'oubliez pas de définir selfcomme UITextFieldDelegateet comme textField réel delegate.

(Merci à Ammagrammer, ce n'est qu'une réponse plus courte utilisant des blocs pour les animations)

Dulgan
la source
0

J'ai autre chose si tu veux. Le point ici est que vous souhaitez définir le centre de votre UIView sur le champ de texte que vous modifiez.

Avant cela, vous devez enregistrer votre INITIAL_CENTER , en tant que CGPoint , de self.view.center et votre INITIAL_VIEW en tant que CGRect de self.view.frame dans une propriété const.

Vous pouvez créer une méthode comme celle-ci:

- (void) centerOn: (CGRect) fieldFrame {

    // Set up the center by taking the original view center
    CGPoint center = CGPointMake(INITIAL_CENTER.x,
                             INITIAL_CENTER.y - ((fieldFrame.origin.y + fieldFrame.size.height/2) - INITIAL_CENTER.y));


    [UIView beginAnimations:@"centerViewOnField" context:nil];
    [UIView setAnimationDuration:0.50];

    if (CGRectEqualToRect(fieldFrame,INITIAL_VIEW)) {
        self.view.frame = INITIAL_VIEW;
        [self.view setCenter:INITIAL_CENTER];
    } else {
        [self.view setCenter:center];
    }


    [UIView commitAnimations];
}

Ensuite, sur votre UITextFieldDelegate , vous devez appeler centerOn: (CGRect) dans les méthodes suivantes:

textFieldDidBeginEditing: (UITextField *) avec, comme paramètre, le cadre du champ de texte sur lequel vous souhaitez centrer.

Et vous devez l'appeler dans votre gestionnaire d'événements, où vous fermez votre clavier,

textFieldDidEndEditing: (UITextField *) peut être l'une des façons de le faire, en mettant INITIAL_VIEW comme paramètre de centerOn: (CGRect) .

Jissay
la source
0

Je crois que sur les versions plus récentes d'iOS (6.1+, peut-être même plus tôt), la vue sous-jacente, au moins pour UITableView, se rétrécit automatiquement lorsque le clavier apparaît. Il vous suffit donc de rendre le champ de texte visible dans cette vue. Dans init:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(keyboardWasShown:)
                                             name:UIKeyboardDidShowNotification
                                           object:nil];

puis:

- (void)keyboardWasShown:(NSNotification*)notification
{
    // Scroll the text field into view so it's not under the keyboard.
    CGRect rect = [self.tableView convertRect:inputView.bounds fromView:inputView];
    [self.tableView scrollRectToVisible:rect animated:YES];
}
Lawrence Kesteloot
la source
0

https://github.com/ZulwiyozaPutra/Shift-Keyboard-Example J'espère que cette solution a aidé. Ils sont tous écrits par Swift 3.

//
//  ViewController.swift
//  Shift Keyboard Example
//
//  Created by Zulwiyoza Putra on 11/23/16.
//  Copyright © 2016 Zulwiyoza Putra. All rights reserved.
//

import UIKit

class ViewController: UIViewController, UITextFieldDelegate {
    
    
    //connecting textfield from storyboard
    @IBOutlet weak var textField: UITextField!
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        subscribeToKeyboardNotifications()
    }
    
    override func viewDidAppear(_ animated: Bool) {
        self.textField.delegate = self
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        unsubscribeFromKeyboardNotifications()
    }
    
    //Hide keyboard after finished editing
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
    }
    
    //Setup view before keyboard appeared
    func keyboardWillAppear(_ notification:Notification) {
        view.frame.origin.y = 0 - getKeyboardHeight(notification)
    }
    
    //Setup view before keyboard disappeared
    func keyboardWillDisappear(_ notification: Notification) {
        view.frame.origin.y = 0
    }
    
    //Getting keyboard height
    func getKeyboardHeight(_ notification:Notification) -> CGFloat {
        let userInfo = notification.userInfo
        let keyboardSize = userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue // of CGRect
        return keyboardSize.cgRectValue.height
    }
    
    //Subscribing to notifications to execute functions
    func subscribeToKeyboardNotifications() {
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillAppear(_:)), name: .UIKeyboardWillShow, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillDisappear(_:)), name: .UIKeyboardWillHide, object: nil)
    }
    
    //Unsubscribing from notifications
    func unsubscribeFromKeyboardNotifications() {
        NotificationCenter.default.removeObserver(self, name: .UIKeyboardWillShow, object: nil)
        NotificationCenter.default.removeObserver(self, name: .UIKeyboardWillHide, object: nil)
    }
    
}

Zulwiyoza Putra
la source