iPhone Klavye UITextField Kapakları


120

Arayüz Oluşturucu'da , UIViewgörünümün altına yakın bir metin alanı olan bir uygulama kurduğum bir uygulamam var . Uygulamayı çalıştırdığımda ve bu alana metin girmeye çalıştığımda, klavye alanın üstüne kayıyor, bu yüzden klavyeyi tekrar gizleyene kadar ne yazdığımı göremiyorum.

Başka biri bu sorunla karşılaştı ve ana görünümü kaydırılabilir hale getirmeden veya metin alanını ekranda daha uzağa taşımadan çözmenin iyi bir yolunu buldu mu?


Yanıtlar:


290

Genel çözüm, alanı (ve üstündeki her şeyi) bir animasyonla yukarı kaydırmak ve işiniz bittiğinde tekrar aşağı kaydırmaktır. Metin alanını ve diğer bazı öğeleri başka bir görünüme yerleştirmeniz ve görünümü bir birim olarak kaydırmanız gerekebilir. (Bunlara "tektonik plakalar" gibi "plakalar" diyorum, ama bu sadece benim). Ama süslenmeniz gerekmiyorsa, genel fikir burada.

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

12
Koda bir bağlantı değil, kodun kendisini göndermiş olmanıza bayılıyorum.
Ben Coffman

2
Harika bir kod. Çalışması veya başka bir şey için düzenlemesine gerek yoktu. Teşekkürler ~
James

5
Aşağıdaki gibi tüm ekranı kaplamak yararlıdır: const int motionDistance = textField.frame.origin.y / 2; // gerektiği gibi
ince

3
"İOS 4 veya üstü için bir uygulama yazıyorsanız, içeriğinizi canlandırmak için blok tabanlı yöntemleri kullanmalısınız" demem gerekir. Referans: developer.apple.com/library/ios/#documentation/windowsviews/…
Mathieu

1
Bunu
buldum

38

Bu, uitextfields'ı kaydırarak benim için harikalar yarattı

Özellikle, metin alanının konumuna bağlı olarak slayt animasyon mesafesini hesaplama avantajına sahiptir.


Bu harika. Her metin alanı için bir 'hareket mesafesi' sabiti seçmeniz gerekmez - bu sizin için hesaplanır.
jlstrecker

Şimdiye kadar en iyi çözüm. Olağanüstü mekanizma!
Mart

1
İPad'de de harika çalışıyor. PORTRAIT_KEYBOARD_HEIGHT = 264 ve LANDSCAPE_KEYBOARD_HEIGHT = 352'yi yeni güncelledim. Harika bağlantı. Teşekkürler.
Khon Lieu

Yukarıdaki bağlantı günümü yaptı! Uygulaması çok basit, şimdiye kadar kusursuz çalışıyor!
JimmyJammed

1
Bu konuyla ilgili en iyi açıklama budur. Diğer öğreticiler Tablo Görünümlerini, Kaydırma Görünümlerini vb. Kullanır. Bu aslında diğer karmaşıklıklara girmeden çalışır, düz ve basit. Bu kaynağı paylaştığınız için teşekkürler.
Renexandro

28

IQKeyboardManager bunu sizin için KOD HATTI YOK , sadece ilgili kaynak dosyayı projeye sürükleyip bırakmanız yeterlidir. IQKeyboardManager ayrıca Aygıt Oryantasyonu , Otomatik UIToolbar Yönetimi , keyboardDistanceFromTextField ve düşündüğünüzden çok daha fazlasını destekler.

görüntü açıklamasını buraya girin

İşte Kontrol Akış Şeması: Kontrol Akış Şeması

Adım1: - küresel bildirimleri eklendi UITextField, UITextViewve UIKeyboardbir tekil sınıfta. Ben buna IQKeyboardManager adını verdim .

Adım 2: - bulduysanız UIKeyboardWillShowNotification, UITextFieldTextDidBeginEditingNotificationya UITextViewTextDidBeginEditingNotificationbildirimler, ardından elde etmeye çalışmak topMostViewControllerdan örneğini UIWindow.rootViewControllerhiyerarşisi. Düzgün bir şekilde ortaya çıkarmak için UITextField/ UITextViewüzerinde, topMostViewController.view'nin kare ayarlanması gerekmektedir.

Adım3: -topMostViewController.view İlk yanıt verilene göre beklenen hareket mesafesi hesaplandı UITextField/ UITextView.

4. adım: - Taşındı topMostViewController.view.framebeklenen hamle mesafeye göre aşağı / yukarı.

Adım 5: - bulduysanız UIKeyboardWillHideNotification, UITextFieldTextDidEndEditingNotificationya UITextViewTextDidEndEditingNotificationbildirim, sonra tekrar elde etmeye çalışmak topMostViewControllerdan örneğini UIWindow.rootViewControllerhiyerarşisi.

Adım 6: - Hesaplanan rahatsızlık mesafesi topMostViewController.vieworijinal konumuna geri getirilmelidir.

Adım7: -topMostViewController.view.frame Bozulan mesafeye göre geri yüklendi .

8. Adım : - Uygulama yüklemesinde tekil IQKeyboardManager sınıf örneği oluşturuldu, böylece uygulamadaki her UITextField/ UITextViewiçindeki, beklenen hareket mesafesine göre otomatik olarak ayarlanacaktır.

Bu kadar


Kabul edilen cevap benim için işe yaramadı. Ama bu var.
öğrenci

@ZaEeMZaFaR IQKeyboardManager ayrıca iPad için optimize edilmiştir. Kütüphane github deposunda bir sayı açıp iPad ile sorunu gösteren bir demo proje yükleyebilir misiniz?
Mohd Iftekhar Qurashi

Cevap için teşekkürler. Sorun devam ederse bunu yapacağım, yorum yapmadan önce IQKeyboardManager'ın evrensel cihaz için olmadığını düşünüyordum.
ZaEeM ZaFaR

Daha fazlasını araştırarak, simülatörde iPad ile iyi çalışıyor ancak gerçek iPad cihazında çalışmıyor. İPhone'da da mükemmel çalışıyor (Device + Simulator). Sorun ne olabilir?
ZaEeM ZaFaR

Daha önce de söylediğim gibi, iOS ve cihaz sürüm detaylarınızla birlikte github repo ile ilgili bir sorunu demo proje ile gündeme getirmelisiniz, böylece konuyu inceleyebiliriz.
Mohd Iftekhar Qurashi

7

Amagrammer cevabını genişletmek için işte örnek bir sınıf:

LoginViewController.h

@interface LoginViewController : UIViewController <UITextFieldDelegate> {

}

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

"UITextFieldDelegate" uyguladığımıza dikkat edin

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

Bahsettiğim için +1 UIApplicationDidEnterBackgroundNotification, aksi takdirde bir Ana Sayfa düğmesine basıp uygulamaya tekrar gelirse daha aşağı hareket eder, çirkin ve hatalı olmasına neden olur.
Adil Soomro

7

Resmi çözüme ne dersiniz: Klavyenin Altında Bulunan İçeriği Taşıma

İçeriğinizi ayarlamak, genellikle bir veya daha fazla görünümü geçici olarak yeniden boyutlandırmayı ve metin nesnesi görünür kalacak şekilde konumlandırmayı içerir. Metin nesnelerini klavye ile yönetmenin en basit yolu, onları bir UIScrollView nesnesinin (veya UITableView gibi alt sınıflarından birinin) içine yerleştirmektir. Klavye görüntülendiğinde, tek yapmanız gereken kaydırma görünümünün içerik alanını sıfırlamak ve istenen metin nesnesini konumuna kaydırmaktır. Bu nedenle, bir UIKeyboardDidShowNotification'a yanıt olarak, işleyici yönteminiz şunları yapacaktır:

  1. Klavyenin boyutunu alın.
  2. Kaydırma görünümünüzün alt içerik ekini klavye yüksekliğine göre ayarlayın.
  3. Hedef metin alanını görünüme kaydırın.
// 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;
}

Bu resmi çözüm artık kontrolde burada bakın sarılır: - stackoverflow.com/a/17707094/1582217
Mohd Iftekhar Qurashi

Fikir iyidir, ancak 'contentInset' özelliği burada yardımcı olmuyor, coz contentInset size sadece dolgu efekti sağlayacaktır: stackoverflow.com/a/10049782/260665
Raj Pawan Gumdal

@Raj, IQKeyboardManager'da bakabileceğim durum bu olabilir, ancak yine de kimse resmi IQKeyboardManager github deposunda contentInset özelliği sorunu ile ilgili herhangi bir sorunu açmadı, bu yüzden çalıştığını varsayıyorum.
Mohd Iftekhar Qurashi

7

UITableView TextField hücrelerinde de aynı sorunla karşılaşıyorum . Klavye bildirimini dinlemek için aşağıdaki yöntemi uygulayarak bu sorunu çözüyorum.

Buradaki bildirimler için gözlemci:

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

Bu bildirimleri aşağıdaki işlevi kullanarak gerçekleştirin:

(void)keyboardWasShown:(NSNotification*)aNotification 
(void)keyboardWillBeHidden:(NSNotification*)aNotification 

1
Bağlantı koptu. Lütfen gelecekte bağımsız bir çözüm eklemeyi düşünün!
miek

5

Şuna bak. Sizin için güçlük yok.

Bu çözüm çok temiz. Tek yapmanız gereken, metin alanlarınızı a eklemek UIScrollViewve TPKeyboardAvoidingScollViewfilm şeridi kullanıyorsanız sınıfını olarak değiştirmek . Kaydırma görünümü, klavyenin göründüğünü algılayacak ve kendisini klavyenin üzerinde makul bir mesafede hareket ettirecek şekilde genişletilmiştir. Mükemmel bir çözüm çünkü sizden bağımsız UIViewController. Yukarıda belirtilen sınıf içinde gerekli her şey yapılır. Michael Tyson ve herkese teşekkürler.

TPKeyboardAvoiding


@NANNAV - Bir yanıtı değiştirmek için önerilerde bulunduğunuzda lütfen yorum sağlayın.
Security Hound

5

Aşağıda Amagrammer'in cevabının hızlı bir versiyonu var. Ayrıca, görünümü yoldan çekmeden önce klavyelerin boyutunu bilmem gerektiğinden, UIKeyboardWillShowNotification olayını kullanan bir varyasyon.

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)
}

4

Metin alanlarını engellemeden düzenlemede harika bir izlenecek yol vardı (bağlantı şimdi öldü, işte bir Wayback bağlantısı: https://web.archive.org/web/20091123074029/http://acts-as-geek.blogspot.com/2009/ 11 / edit-textfields-without-obscuring.html ). Var UIViewolanın bir üzerine nasıl taşınacağını UIScrollViewve klavye göründüğünde otomatik olarak kaydırılacağını gösterir.

Altında UIScrollViewkontroller (a gibi UITabBar) olduğunda doğru yüksekliği hesaplamak için biraz güncelledim UIScrollBar. Uiview güncelleme gönderisine bakın .


2

İşte Xcode5, iOS7 kullanan bir çözüm:

UITextfieldDelegate ve animasyon bloklarını kullanın.

Bu, ViewController için neredeyse tüm koddur, ancak temsilci kalıbına hala biraz aşina olmayanlar için (benim gibi) temsilci kodunu dahil etmek istedim. Ayrıca metin görünümünden uzağa dokunduğunuzda klavyeyi gizlemek için kod ekledim.

Görünümleri (düğmeler, metin alanları, vb.) İstediğiniz kadar yükseğe taşıyabilirsiniz, sadece yerlerine geri koyduğunuzdan emin olun (+100 sonra sonra -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];
}

1

Sanırım bir yol, metin alanı tıklandığında tüm görünüm konumunuzu (x, y) 'den (x, y-keybaardHeight)' a taşımak ve klavye kapatıldığında onu geri koymak olabilir, görünüm biraz tuhaf görünebilir. ortaya çıkar (belki canlandırırsanız kötü olmaz).

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    CGRect frame=self.view.frame;
    frame.origin=CGPointMake(x...//set point here
    self.view.frame=frame;
}

Hayır değil. Kullanıcı ilk metin alanına dokunursa, görünen alanın üstüne çıkacaktır.
lolol

0

Amagrammer'ın çözümüne ek olarak, cocos2d'yi portre modunda kullanıyorsanız şu satırı değiştirin:

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

buna:

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

Eğer yatay modda Cocos2d kullanıyorsanız, yukarıdaki değişikliği yapmak ve geçiş updeğerleri textFieldDidBeginEditing:vetextFieldDidEndEditing:

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

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

0

Aynı sorunu yaşadım ve GTKeyboardHelper'ı kolay bir çıkış yolu olarak buldum.

Çerçeveyi projenize sürükleyip bıraktıktan sonra, başlık dosyasını ekleyin. Örnek projeyi indirin ve açın, ardından "Klavye Yardımcısı" nesnesini xib'deki nesneler bölümünden projenizin arayüz oluşturucusundaki nesneler bölümüne sürükleyin.

"Klavye Yardımcısı" nın alt öğeleri olmak için tüm görünümlerinizi sürükleyip bırakın.


0

Projelerimde kullandığım çerçeveyi sürükle ve bırak. İlk yanıtlayanın dışına dokunduğunuzda veya kaydırdığınızda otomatik kapatmayı destekler.

GTKeyboardHelper


0

Görünümü gerektiği gibi yukarı ve aşağı kaydırmanız yeterlidir:

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

Ayarlamak unutmayın selfbir şekilde UITextFieldDelegateve gerçek textfield'ı olarak delegate.

(Ammagrammer sayesinde, bu, animasyonlar için bloklar kullanan daha kısa bir cevaptır)


0

İstersen bende başka bir şey var. Buradaki nokta, UIView görünümünüzü düzenlemekte olduğunuz metin alanında merkeze ayarlamak istemenizdir.

Bundan önce, INITIAL_CENTER'ınızı self.view.center'dan bir CGPoint olarak ve INITIAL_VIEW'i bir const özelliğindeki self.view.frame'den bir CGRect olarak kaydetmeniz gerekir.

Bunun gibi bir yöntem oluşturabilirsiniz:

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

Ardından, üzerinde UITextFieldDelegate , aramak zorunda (CGRect): centerOn yöntemleri aşağıdaki:

textFieldDidBeginEditing: (UITextField *) , bir parametre olarak ortalamak istediğiniz metin alanının çerçevesiyle birlikte.

Ve bunu, klavyenizi kapattığınız olay işleyicinizden çağırmalısınız,

textFieldDidEndEditing: (UITextField *) , INITIAL_VIEW'i centerOn: (CGRect) parametresi olarak koyarak bunu yapmanın yollarından biri olabilir .


0

IOS'un daha yeni sürümlerinde (6.1+, muhtemelen daha da eski), temel görünümün, en azından UITableView için, klavye açıldığında otomatik olarak küçüldüğüne inanıyorum. Bu nedenle, metin alanını bu görünümde görünür yapmanız yeterlidir. İçinde init:

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

sonra:

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

0

https://github.com/ZulwiyozaPutra/Shift-Keyboard-Example Umarım bu çözüm yardımcı olmuştur. Hepsi Swift 3 ile yazılmış.

//
//  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)
    }
    
}

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.