iPhone Tastaturabdeckungen UITextField

120

Ich habe eine App, in der ich in Interface Builder eine eingerichtet habeUIView mit einem Textfeld am unteren Rand der Ansicht eingerichtet habe. Wenn ich die App starte und versuche, Text in dieses Feld einzugeben, wird die Tastatur über das Feld geschoben, sodass ich nicht sehen kann, was ich tippe, bis ich die Tastatur wieder ausgeblendet habe.

Ist jemand anderes auf dieses Problem gestoßen und hat einen guten Weg gefunden, es zu lösen, ohne die übergeordnete Ansicht scrollbar zu machen oder das Textfeld weiter nach oben zu verschieben?

Cruinh
quelle

Antworten:

290

Die übliche Lösung besteht darin, das Feld (und alles darüber) mit einer Animation nach oben und dann wieder nach unten zu schieben, wenn Sie fertig sind. Möglicherweise müssen Sie das Textfeld und einige der anderen Elemente in eine andere Ansicht einfügen und die Ansicht als Einheit verschieben. (Ich nenne diese Dinge "Platten" wie bei "tektonischen Platten", aber das bin nur ich). Aber hier ist die allgemeine Idee, wenn Sie keine Lust haben müssen.

- (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
quelle
12
Ich liebe es, dass Sie keinen Link zum Code gepostet haben, sondern den Code selbst.
Ben Coffman
2
Tolles Stück Code. Musste es nicht bearbeiten, damit es funktioniert oder so. Danke ~
James
5
Es ist nützlich, den gesamten Bildschirm wie folgt abzudecken: const int motionDistance = textField.frame.origin.y / 2; // nach Bedarf
anpassen
3
Ich muss erwähnen, dass "Wenn Sie eine Anwendung für iOS 4 oder höher schreiben, sollten Sie stattdessen die blockbasierten Methoden zum Animieren Ihrer Inhalte verwenden." Referenziert von: developer.apple.com/library/ios/#documentation/windowsviews/…
Mathieu
1
Fand dies und es diskutiert das gleiche Problem developer.apple.com/Library/ios/documentation/StringsTextFonts/…
unom
38

Das hat Wunder gewirkt, als ich Uitextfelder verschoben habe

Insbesondere hat es den Vorteil, dass der Abstand der Folienanimation in Abhängigkeit von der Position des Textfelds berechnet wird.

Apfelwein
quelle
Das ist toll. Sie müssen nicht für jedes Textfeld eine Konstante für die Bewegungsentfernung auswählen - sie wird für Sie berechnet.
Jlstrecker
Mit Abstand beste Lösung. Phänomenaler Mechanismus!
Marchy
1
Funktioniert auch auf dem iPad hervorragend. Ich habe gerade PORTRAIT_KEYBOARD_HEIGHT = 264 und LANDSCAPE_KEYBOARD_HEIGHT = 352 aktualisiert. Großartiger Link. Vielen Dank.
Khon Lieu
Der obige Link hat gerade meinen Tag gemacht! So einfach zu implementieren, funktioniert bisher einwandfrei!
JimmyJammed
1
Dies ist die beste Erklärung zu diesem Thema. Andere Tutorials verwenden Tabellenansichten, Bildlaufansichten usw. Dies funktioniert tatsächlich, ohne auf andere Komplexitäten einzugehen, schlicht und einfach. Vielen Dank für das Teilen dieser Quelle.
Renexandro
28

IQKeyboardManager tun dies für Sie mit NO Codezeile , nur zu ziehen müssen und damit verbundene Quelle Projektdatei löschen. IQKeyboardManager auch unterstützen Geräteausrichtung , automatische UIToolbar - Management , keyboardDistanceFromTextField und viel mehr , als Sie denken.

Geben Sie hier die Bildbeschreibung ein

Hier ist das Kontrollflussdiagramm: Kontrollflussdiagramm

Schritt 1: - Hinzugefügt globale Meldungen von UITextField, UITextViewund UIKeyboardin einer Singleton - Klasse. Ich habe es IQKeyboardManager genannt .

Schritt 2: - Wenn Sie gefunden werden UIKeyboardWillShowNotification, UITextFieldTextDidBeginEditingNotificationoder UITextViewTextDidBeginEditingNotificationBenachrichtigungen, dann versuchen zu bekommen topMostViewControllerInstanz aus der UIWindow.rootViewControllerHierarchie. Um richtig aufzudecken UITextField/ UITextViewSie darauf topMostViewController.viewbraucht ‚s Rahmen angepasst werden.

Schritt 3: - Berechnete erwartete Bewegungsentfernung in topMostViewController.viewBezug auf die zuerst beantwortete UITextField/ UITextView.

Schritt 4: -topMostViewController.view.frame Entsprechend der erwarteten Bewegungsentfernung nach oben / unten bewegt.

Schritt 5: - Wenn Sie gefunden werden UIKeyboardWillHideNotification, UITextFieldTextDidEndEditingNotificationoder UITextViewTextDidEndEditingNotificationBenachrichtigung, dann versuchen Sie es erneut zu bekommen topMostViewControllerInstanz aus der UIWindow.rootViewControllerHierarchie.

Schritt 6: - Berechnete gestörte Entfernung, topMostViewController.viewderen ursprüngliche Position wiederhergestellt werden muss.

Schritt 7: - WiederhergestellttopMostViewController.view.frame Entsprechend der gestörten Entfernung .

Schritt 8: - Instanziierte Singleton- IQKeyboardManager- Klasseninstanz beim Laden der App, sodass jedes UITextField/ UITextViewin der App automatisch an die erwartete Bewegungsentfernung angepasst wird.

Das ist alles

Mohd Iftekhar Qurashi
quelle
Die akzeptierte Antwort funktionierte bei mir nicht. Aber dieser tut es.
Lerner
@ZaEeMZaFaR IQKeyboardManager ist auch für das iPad optimiert. Können Sie bitte eine Ausgabe auf Library Github Repo öffnen und ein Demo-Projekt hochladen, das die Ausgabe mit dem iPad demonstriert?
Mohd Iftekhar Qurashi
Danke für die Antwort. Ich werde das tun, wenn das Problem weiterhin besteht. Bevor Sie einen Kommentar abgeben, dachte ich, dass IQKeyboardManager nicht für universelle Geräte geeignet ist.
ZaEeM ZaFaR
Wenn Sie mehr untersuchen, funktioniert es gut mit dem iPad auf dem Simulator, aber nicht auf dem tatsächlichen iPad-Gerät. Funktioniert auch auf dem iPhone (Gerät + Simulator) einwandfrei. Was könnte das Problem sein?
ZaEeM ZaFaR
Wie ich bereits sagte, sollten Sie ein Problem mit Github Repo mit Demo-Projekt mit Ihren iOS- und Geräteversionsdetails ansprechen, damit wir das Problem untersuchen können.
Mohd Iftekhar Qurashi
7

Um die Amagrammer-Antwort zu erweitern, finden Sie hier eine Beispielklasse:

LoginViewController.h

@interface LoginViewController : UIViewController <UITextFieldDelegate> {

}

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

Beachten Sie, dass wir das "UITextFieldDelegate" implementieren.

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
quelle
+1 zum Erwähnen UIApplicationDidEnterBackgroundNotification, sonst bewegt es sich mehr nach unten, wenn man die Home-Taste drückt und wieder in die App kommt, was dazu führt, dass sie hässlich und fehlerhaft ist.
Adil Soomro
7

Wie wäre es mit der offiziellen Lösung: Verschieben von Inhalten, die sich unter der Tastatur befinden

Das Anpassen Ihres Inhalts umfasst normalerweise das vorübergehende Ändern der Größe einer oder mehrerer Ansichten und deren Positionierung, sodass das Textobjekt sichtbar bleibt. Die einfachste Möglichkeit, Textobjekte mit der Tastatur zu verwalten, besteht darin, sie in ein UIScrollView-Objekt (oder eine seiner Unterklassen wie UITableView) einzubetten. Wenn die Tastatur angezeigt wird, müssen Sie lediglich den Inhaltsbereich der Bildlaufansicht zurücksetzen und das gewünschte Textobjekt in Position bringen. In Reaktion auf eine UIKeyboardDidShowNotification würde Ihre Handlermethode daher Folgendes tun:

  1. Holen Sie sich die Größe der Tastatur.
  2. Passen Sie den unteren Inhalt Ihrer Bildlaufansicht an die Tastaturhöhe an.
  3. Scrollen Sie durch das Zieltextfeld in die Ansicht.
// 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
quelle
Diese offizielle Lösung ist jetzt in ein Steuerelement eingewickelt, siehe hier: - stackoverflow.com/a/17707094/1582217
Mohd Iftekhar Qurashi
Die Idee ist gut, aber die Eigenschaft 'contentInset' hilft hier nicht weiter. Coz contentInset bietet Ihnen lediglich den Auffüllungseffekt: stackoverflow.com/a/10049782/260665
Raj Pawan Gumdal
@ Raj, das mag der Fall sein, den ich auf IQKeyboardManager sehen kann, aber immer noch öffnet niemand irgendwelche Probleme im offiziellen IQKeyboardManager-Github-Repository in Bezug auf das ContentInset-Eigenschaftsproblem, also gehe ich davon aus, dass es funktioniert.
Mohd Iftekhar Qurashi
7

Ich habe das gleiche Problem in UITableView textField-Zellen. Ich löse dieses Problem, indem ich die folgende Methode implementiere, um die Tastaturbenachrichtigung abzuhören.

Beobachter für die Benachrichtigungen hier:

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

Behandeln Sie diese Benachrichtigung mithilfe der folgenden Funktion:

(void)keyboardWasShown:(NSNotification*)aNotification 
(void)keyboardWillBeHidden:(NSNotification*)aNotification 
Boobalan
quelle
1
Die Verbindung ist unterbrochen. Bitte erwägen Sie in Zukunft eine unabhängige Lösung!
Miek
5

Überprüfen Sie dies heraus. Kein Ärger für dich.

Diese Lösung ist sehr ordentlich. Alles, was Sie tun müssen, ist, Ihre Textfelder in a hinzuzufügen UIScrollViewund ihre Klasse in zu ändern TPKeyboardAvoidingScollView, wenn Sie Storyboards verwenden. Die Bildlaufansicht wird so erweitert, dass sie erkennt, wann die Tastatur sichtbar ist, und sich in angemessenem Abstand über der Tastatur bewegt. Es ist die perfekte Lösung, weil es unabhängig von Ihnen ist UIViewController. Alles Notwendige wird innerhalb der oben genannten Klasse erledigt. Vielen Dank an Michael Tyson und alle.

TPKeyboardAvoiding

Aruna
quelle
@NANNAV - Bitte geben Sie Kommentare ab, wenn Sie Vorschläge zum Ändern einer Antwort machen.
Sicherheitshund
5

Unten finden Sie eine schnelle Version von Amagrammers Antwort. Auch eine Variation mit dem UIKeyboardWillShowNotification-Ereignis, da ich die Tastaturgröße kennen musste, bevor ich die Ansicht aus dem Weg räumen konnte.

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

Es gab eine großartige Anleitung zum Bearbeiten von Textfeldern ohne Verschleierung (Link jetzt tot, hier ist ein Wayback-Link: https://web.archive.org/web/20091123074029/http://acts-as-geek.blogspot.com/2009/ 11 / editing-textfields-without-obscuring.html ). Es zeigt, wie Sie ein vorhandenes UIViewObjekt auf ein UIScrollViewObjekt verschieben und es automatisch scrollen, wenn die Tastatur angezeigt wird.

Ich habe es ein wenig aktualisiert, um die richtige Höhe für den Fall zu berechnen, UIScrollViewdass sich Steuerelemente (wie z. B. a UITabBar) unter dem befinden UIScrollBar. Siehe Beitrag Aktualisierung uiview .

GargantuChet
quelle
2

Hier ist eine Lösung mit Xcode5, iOS7:

Verwenden Sie die Blöcke UITextfieldDelegate und Animation.

Dies ist fast der gesamte Code für den ViewController, aber ich wollte den Delegatencode für diejenigen einschließen, die mit dem Delegatenmuster noch nicht vertraut sind (wie ich). Ich habe auch Code eingefügt, um die Tastatur auszublenden, wenn Sie von der Textansicht weg tippen.

Sie können die Ansichten (Schaltflächen, Textfelder usw.) so hoch verschieben, wie Sie möchten. Stellen Sie lediglich sicher, dass sie wieder angebracht sind (+100, später -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
quelle
1

Ich denke, eine Möglichkeit wäre, die Position Ihrer gesamten Ansicht von (x, y) nach (x, y-keybaardHeight) zu verschieben, wenn Sie auf das Textfeld klicken, und es zurückzusetzen, wenn die Tastatur geschlossen wird kommt auf (vielleicht wäre es nicht schlecht, wenn Sie es animieren).

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    CGRect frame=self.view.frame;
    frame.origin=CGPointMake(x...//set point here
    self.view.frame=frame;
}
Daniel
quelle
Nein, ist es nicht. Wenn der Benutzer auf das erste Textfeld tippt, wird es über dem sichtbaren Bereich angezeigt.
Lolol
0

Wenn Sie cocos2d im Hochformat verwenden, ändern Sie zusätzlich zur Amagrammer-Lösung diese Zeile:

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

dazu:

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

Wenn Sie cocos2d im Querformat verwenden, nehmen Sie die obigen Änderungen vor und wechseln Sie die upWerte in textFieldDidBeginEditing:undtextFieldDidEndEditing:

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

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

Ich hatte das gleiche Problem und fand, dass GTKeyboardHelper ein einfacher Ausweg ist.

Fügen Sie nach dem Ziehen und Ablegen des Frameworks in Ihr Projekt die Header-Datei hinzu. Laden Sie das Beispielprojekt herunter, öffnen Sie es und ziehen Sie das Objekt "Keyboard Helper" aus dem Objektbereich in der xib in den Objektbereich im Interface Builder Ihres Projekts.

Ziehen Sie alle Ihre Ansichten per Drag & Drop, um Kinder des "Keyboard Helper" zu sein.

Andrei Nagy
quelle
0

Drag & Drop-Framework, das ich in meinen Projekten verwende. Unterstützt die automatische Entlassung, wenn Sie außerhalb eines Ersthelfers tippen oder wenn Sie einen Bildlauf durchführen.

GTKeyboardHelper

Mackross
quelle
0

Schieben Sie die Ansicht nach Bedarf nach oben und unten:

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

Vergessen Sie nicht, selfals UITextFieldDelegateund als eigentliches Textfeld festzulegendelegate .

(Dank Ammagrammer ist dies nur eine kürzere Antwort, bei der Blöcke für Animationen verwendet werden.)

Dulgan
quelle
0

Ich habe noch etwas, wenn du willst. Der Punkt hier ist, dass Sie die Mitte Ihrer UIView auf dem Textfeld festlegen möchten, das Sie bearbeiten.

Zuvor müssen Sie Ihr INITIAL_CENTER als CGPoint aus self.view.center und Ihr INITIAL_VIEW als CGRect aus self.view.frame in einer const-Eigenschaft speichern.

Sie können eine Methode wie folgt erstellen:

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

Dann auf Ihrem UITextFieldDelegate , müssen Sie rufen centerOn: (CGRect) in folgenden Methoden:

textFieldDidBeginEditing: (UITextField *) mit als Parameter dem Rahmen des Textfelds, auf das Sie sich konzentrieren möchten.

Und Sie müssen es in Ihrem Event-Handler aufrufen, wo Sie Ihre Tastatur schließen,

textFieldDidEndEditing: (UITextField *) kann eine der Möglichkeiten sein, dies zu tun, indem INITIAL_VIEW als Parameter von centerOn: (CGRect) verwendet wird .

Jissay
quelle
0

Ich glaube, dass bei neueren Versionen von iOS (6.1+, möglicherweise sogar früher) die zugrunde liegende Ansicht, zumindest für UITableView, automatisch verkleinert wird, wenn die Tastatur angezeigt wird. Sie müssen also nur das Textfeld in dieser Ansicht sichtbar machen. In init:

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

dann:

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

https://github.com/ZulwiyozaPutra/Shift-Keyboard-Example Ich hoffe, diese Lösung hat geholfen. Sie sind alle Swift 3 geschrieben.

//
//  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
quelle