Keyboard iPhone Meliputi UITextField

120

Saya memiliki aplikasi di mana, di Interface Builder , saya menyiapkan UIViewyang memiliki bidang teks di dekat bagian bawah tampilan. Ketika saya menjalankan aplikasi dan mencoba memasukkan teks ke dalam bidang itu, papan ketik bergeser ke atas bidang tersebut sehingga saya tidak dapat melihat apa yang saya ketik sampai saya menyembunyikan papan ketik itu lagi.

Apakah ada orang lain yang mengalami masalah ini dan menemukan cara yang baik untuk menyelesaikannya tanpa membuat tampilan induk dapat digulir atau memindahkan bidang teks lebih jauh ke atas layar?

Cruinh
sumber
Kemungkinan duplikat dari Cara membuat UITextField naik saat keyboard tersedia
Ratul Sharker

Jawaban:

290

Solusi yang biasa adalah menggeser bidang (dan semua yang ada di atasnya) ke atas dengan animasi, dan kemudian mundur setelah selesai. Anda mungkin perlu meletakkan bidang teks dan beberapa item lainnya ke tampilan lain dan menggeser tampilan sebagai satu unit. (Saya menyebutnya "lempeng" seperti "lempeng tektonik", tapi itu hanya saya). Tapi inilah gambaran umumnya jika Anda tidak perlu menjadi mewah.

- (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
sumber
12
Senang sekali Anda tidak memposting tautan ke kode, tetapi kode itu sendiri.
Ben Coffman
2
Sedikit kode yang bagus. Tidak perlu mengeditnya agar berfungsi atau apa pun. Terima kasih ~
James
5
Berguna untuk menutupi semua layar seperti di bawah ini: const int movementDistance = textField.frame.origin.y / 2; //
ubah
3
Saya harus menyebutkan bahwa "Jika Anda menulis aplikasi untuk iOS 4 atau lebih baru, Anda harus menggunakan metode berbasis blok untuk menganimasikan konten Anda sebagai gantinya." Dirujuk dari: developer.apple.com/library/ios/#documentation/windowsviews/…
Mathieu
1
Menemukan ini dan membahas masalah yang sama developer.apple.com/Library/ios/documentation/StringsTextFonts/…
unom
38

Ini berhasil keajaiban bagi saya menggeser bidang uitext

Secara khusus ini memiliki keuntungan dalam menghitung jarak animasi slide tergantung pada posisi bidang teks.

cidered
sumber
Ini bagus. Anda tidak harus memilih beberapa konstanta 'jarak pergerakan' untuk setiap bidang teks - ini dihitung untuk Anda.
jlstrecker
Solusi terbaik sejauh ini. Mekanisme fenomenal!
Marchy
1
Bekerja dengan baik di iPad juga. Saya baru saja memperbarui PORTRAIT_KEYBOARD_HEIGHT = 264 dan LANDSCAPE_KEYBOARD_HEIGHT = 352. Tautan bagus. Terima kasih.
Khon Lieu
Tautan di atas baru saja membuat hari saya menyenangkan! Sangat sederhana untuk diterapkan, bekerja dengan sempurna sejauh ini!
JimmyJammed
1
Ini adalah penjelasan terbaik di luar sana tentang topik ini. Tutorial lain menggunakan Tampilan Tabel, Tampilan Gulir, dll. Ini benar-benar berfungsi tanpa masuk ke kerumitan lain, polos dan sederhana. Terima kasih telah membagikan sumber ini.
Renexandro
28

IQKeyboardManager melakukan ini untuk Anda TANPA BARIS KODE , hanya perlu menyeret dan melepas file sumber terkait ke proyek. IQKeyboardManager juga mendukung Orientasi Perangkat , Manajemen UIToolbar Otomatis , keyboardDistanceFromTextField , dan banyak lagi dari yang Anda kira.

masukkan deskripsi gambar di sini

Berikut adalah Diagram Alir Kontrol: Diagram Alir Kontrol

Langkah 1: - Ditambahkan pemberitahuan global UITextField, UITextViewdan UIKeyboarddi kelas tunggal. Saya menyebutnya IQKeyboardManager .

Langkah2: - Jika ditemukan UIKeyboardWillShowNotification, UITextFieldTextDidBeginEditingNotificationatau UITextViewTextDidBeginEditingNotificationpemberitahuan, maka coba dapatkan topMostViewControllerinstance dari UIWindow.rootViewControllerhierarki. Untuk mengungkap UITextField/ UITextViewdi atasnya dengan benar, topMostViewController.viewbingkai perlu disesuaikan.

Langkah 3 : - Menghitung jarak pergerakan yang diharapkan topMostViewController.viewsehubungan dengan respons pertama UITextField/ UITextView.

Step4: - Pindah ke topMostViewController.view.frameatas / bawah sesuai dengan jarak pergerakan yang diharapkan.

Step5: - Jika ditemukan UIKeyboardWillHideNotification, UITextFieldTextDidEndEditingNotificationatau UITextViewTextDidEndEditingNotificationnotifikasi, maka coba lagi untuk mendapatkan topMostViewControllerinstance dari UIWindow.rootViewControllerhierarki.

Langkah 6: - Jarak terputus yang dihitung topMostViewController.viewyang perlu dikembalikan ke posisi semula.

Step7: - Dipulihkan topMostViewController.view.framesesuai dengan jarak yang terganggu.

Langkah 8: - Instance kelas IQKeyboardManager tunggal yang dibuat instance-nya saat aplikasi dimuat, sehingga setiap UITextField/ UITextViewdalam aplikasi akan menyesuaikan secara otomatis sesuai dengan jarak pergerakan yang diharapkan.

Itu saja

Mohd Iftekhar Qurashi
sumber
Jawaban yang diterima tidak berhasil untuk saya. Tapi yang ini bisa.
pelajar
@ZaEeMZaFaR IQKeyboardManager juga dioptimalkan untuk iPad. Bisakah Anda membuka masalah di perpustakaan github repo dan mengunggah proyek demo yang mendemonstrasikan masalah dengan iPad?
Mohd Iftekhar Qurashi
Terima kasih atas balasannya. Saya akan melakukannya jika masalah terus berlanjut, sebelum Anda berkomentar, saya berpikir bahwa IQKeyboardManager bukan untuk perangkat universal.
ZaEeM ZaFaR
Dengan Menyelidiki lebih lanjut, ini berfungsi dengan baik dengan iPad pada simulator tetapi tidak pada perangkat iPad yang sebenarnya. Bekerja dengan sangat baik di iPhone juga (Perangkat + Simulator). Apa masalahnya?
ZaEeM ZaFaR
Seperti yang saya katakan sebelumnya, Anda harus mengangkat masalah pada repo github dengan proyek demo dengan detail versi iOS dan perangkat Anda, sehingga kami dapat memeriksa masalah tersebut.
Mohd Iftekhar Qurashi
7

Untuk memperluas jawaban Amagrammer, berikut adalah contoh kelasnya:

LoginViewController.h

@interface LoginViewController : UIViewController <UITextFieldDelegate> {

}

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

Perhatikan bahwa kami sedang mengimplementasikan "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
sumber
1 untuk disebutkan UIApplicationDidEnterBackgroundNotification, jika tidak maka akan bergerak lebih ke bawah jika seseorang menekan tombol Beranda dan kembali lagi ke aplikasi, menyebabkannya jelek dan buggy.
Adil Soomro
7

Bagaimana dengan solusi resminya: Memindahkan Konten Yang Terletak Di Bawah Keyboard

Menyesuaikan konten Anda biasanya melibatkan mengubah ukuran sementara satu atau beberapa tampilan dan memposisikannya sehingga objek teks tetap terlihat. Cara termudah untuk mengelola objek teks dengan keyboard adalah dengan menyematkannya di dalam objek UIScrollView (atau salah satu subkelasnya seperti UITableView). Saat keyboard ditampilkan, yang harus Anda lakukan adalah mereset area konten tampilan gulir dan menggulir objek teks yang diinginkan ke posisinya. Jadi, sebagai tanggapan terhadap UIKeyboardDidShowNotification, metode penangan Anda akan melakukan hal berikut:

  1. Dapatkan ukuran keyboard.
  2. Sesuaikan inset konten bawah tampilan gulir Anda dengan ketinggian keyboard.
  3. Gulir bidang teks target ke tampilan.
// 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
sumber
Solusi resmi ini sekarang dibungkus dalam kontrol lihat di sini: - stackoverflow.com/a/17707094/1582217
Mohd Iftekhar Qurashi
Ide bagus, tetapi properti 'contentInset' tidak membantu di sini, karena contentInset hanya akan memberi Anda efek padding: stackoverflow.com/a/10049782/260665
Raj Pawan Gumdal
@Raj, Itu mungkin kasus yang dapat saya lihat di IQKeyboardManager, tetapi tetap tidak ada yang membuka masalah apa pun di repositori github IQKeyboardManager resmi terkait masalah properti contentInset, jadi saya menganggapnya berfungsi.
Mohd Iftekhar Qurashi
7

Saya menghadapi masalah yang sama di UITableView sel bidang teks. Saya mengatasi masalah ini dengan menerapkan metode berikut untuk mendengarkan pemberitahuan keyboard.

Perhatikan notifikasi di sini:

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

Tangani notifikasi tersebut dengan menggunakan fungsi di bawah ini:

(void)keyboardWasShown:(NSNotification*)aNotification 
(void)keyboardWillBeHidden:(NSNotification*)aNotification 
Boobalan
sumber
1
Tautannya rusak. Harap pertimbangkan untuk menyertakan solusi independen di masa mendatang!
miek
5

Lihat ini. Tidak merepotkan Anda.

Solusi ini sangat rapi. Yang harus Anda lakukan adalah menambahkan bidang teks Anda di a UIScrollViewdan mengubah kelasnya menjadi TPKeyboardAvoidingScollView, jika Anda menggunakan papan cerita. Tampilan gulir diperpanjang sedemikian rupa sehingga akan mendeteksi saat keyboard terlihat dan akan bergerak sendiri di atas keyboard pada jarak yang wajar. Ini adalah solusi sempurna karena tidak bergantung pada Anda UIViewController. Setiap hal yang diperlukan dilakukan dalam kelas yang disebutkan di atas. Terima kasih Michael Tyson dkk.

TPKeyboardMenghindari

Aruna
sumber
@NANNAV - Berikan komentar saat Anda memberikan saran untuk mengubah jawaban.
Security Hound
5

Di bawah ini adalah versi cepat dari jawaban Amagrammer. Juga, variasi menggunakan acara UIKeyboardWillShowNotification karena saya perlu mengetahui ukuran keyboard sebelum memindahkan tampilan.

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
sumber
4

Ada panduan hebat dalam mengedit bidang teks tanpa mengaburkan (tautan mati sekarang, inilah tautan Wayback: https://web.archive.org/web/20091123074029/http://acts-as-geek.blogspot.com/2009/ 11 / mengedit-bidang teks-tanpa-obscuring.html ). Ini menunjukkan cara memindahkan yang ada UIViewke a UIScrollView, dan menggulirnya secara otomatis saat keyboard muncul.

Saya telah memperbaruinya sedikit untuk menghitung ketinggian yang benar UIScrollViewketika ada kontrol (seperti a UITabBar) di bawah UIScrollBar. Lihat posting memperbarui tampilan .

GargantuChet
sumber
2

Berikut solusi menggunakan Xcode5, iOS7:

Gunakan blok UITextfieldDelegate dan animasi.

Ini hampir semua kode untuk ViewController tetapi saya ingin menyertakan kode delegasi untuk mereka yang masih agak asing dengan pola delegasi (seperti saya). Saya juga menyertakan kode untuk menyembunyikan keyboard saat Anda mengetuk keluar dari tampilan teks.

Anda dapat memindahkan tampilan (tombol, bidang teks, dll) setinggi yang Anda inginkan, pastikan untuk mengembalikannya ke tempatnya (+100 lalu -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
sumber
1

Saya kira salah satu cara akan memindahkan seluruh posisi tampilan Anda dari (x, y) ke (x, y-keybaardHeight) saat textfield diklik dan mengembalikannya saat keyboard ditutup, mungkin terlihat sedikit aneh sebagai tampilan saja muncul (mungkin tidak akan buruk jika Anda menghidupkannya).

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    CGRect frame=self.view.frame;
    frame.origin=CGPointMake(x...//set point here
    self.view.frame=frame;
}
Daniel
sumber
Tidak. Jika pengguna mengetuk bidang teks pertama, itu akan berada di atas area yang terlihat.
lolol
0

Selain solusi Amagrammer, jika Anda menggunakan cocos2d dalam mode potret, ubah baris ini:

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

untuk ini:

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

Jika Anda menggunakan cocos2d dalam mode lanskap, lakukan perubahan di atas dan ubah upnilainya menjadi textFieldDidBeginEditing:dantextFieldDidEndEditing:

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

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

Saya memiliki masalah yang sama dan menemukan GTKeyboardHelper sebagai jalan keluar yang mudah.

Setelah drag and drop kerangka dalam proyek Anda, sertakan file header. Unduh dan buka proyek contoh, lalu seret objek "Pembantu Keyboard" dari bagian objek di xib ke bagian objek di pembuat antarmuka proyek Anda.

Tarik dan lepas semua tampilan Anda untuk menjadi anak-anak "Pembantu Keyboard".

Andrei Nagy
sumber
0

Seret dan lepas kerangka kerja yang saya gunakan dalam proyek saya. Mendukung pemecatan otomatis saat Anda mengetuk di luar responden pertama atau saat Anda menggulir.

GTKeyboardHelper

mackross
sumber
0

Geser tampilan ke atas dan ke bawah sesuai kebutuhan:

- (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);
    }];
}

Jangan lupa untuk menetapkan selfsebagai UITextFieldDelegatedan sebagai bidang teks sebenarnya delegate.

(Terima kasih kepada Ammagrammer, ini hanya jawaban yang lebih singkat menggunakan blok untuk animasi)

Dulgan
sumber
0

Saya punya sesuatu yang lain jika Anda mau. Intinya di sini adalah Anda ingin mengatur pusat UIView Anda pada bidang teks yang sedang Anda edit.

Sebelum itu, Anda harus menyimpan INITIAL_CENTER Anda , sebagai CGPoint , dari self.view.center dan INITIAL_VIEW Anda sebagai CGRect dari self.view.frame di properti const.

Anda dapat membuat metode seperti ini:

- (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];
}

Kemudian, pada UITextFieldDelegate , Anda harus menghubungi centerOn: (CGRect) dengan metode berikut:

textFieldDidBeginEditing: (UITextField *) dengan, sebagai parameter, bingkai bidang teks yang ingin Anda pusatkan .

Dan Anda harus memanggilnya di event handler, tempat Anda menutup keyboard,

textFieldDidEndEditing: (UITextField *) bisa menjadi salah satu cara untuk melakukannya, dengan menempatkan INITIAL_VIEW sebagai parameter centerOn: (CGRect) .

Jissay
sumber
0

Saya percaya pada versi iOS yang lebih baru (6.1+, bahkan mungkin lebih awal), tampilan yang mendasarinya, setidaknya untuk UITableView, menyusut otomatis saat keyboard muncul. Jadi, Anda hanya perlu membuat bidang teks terlihat dalam tampilan itu. Masuk init:

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

kemudian:

- (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
sumber
0

https://github.com/ZulwiyozaPutra/Shift-Keyboard-Example Saya harap solusi ini membantu. Semuanya ditulis 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
sumber