Чехлы для клавиатуры iPhone UITextField

У меня есть приложение, в котором в Interface Builder я настраиваю UIView с текстовым полем в нижней части представления. Когда я запускаю приложение и пытаюсь ввести текст в это поле, клавиатура скользит вверх по полю, поэтому я не вижу, что печатаю, пока снова не скрою клавиатуру.

Кто-нибудь еще сталкивался с этой проблемой и нашел хороший способ решить ее, не делая прокручиваемое родительское представление или не перемещая текстовое поле дальше по экрану?


person Cruinh    schedule 07.08.2009    source источник
comment
Возможный дубликат Как поднять UITextField при наличии клавиатуры   -  person Ratul Sharker    schedule 22.01.2016


Ответы (18)


Обычное решение - сдвинуть поле (и все, что над ним) вверх с помощью анимации, а затем вернуться вниз, когда вы закончите. Возможно, вам потребуется поместить текстовое поле и некоторые другие элементы в другое представление и сдвинуть представление как единое целое. (Я называю это «плитами», как в «тектонических плитах», но это только я). Но вот общая идея, если вам не нужно фантазировать.

- (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];
}
person Amagrammer    schedule 08.08.2009
comment
Мне нравится, что вы разместили не ссылку на код, а сам код. - person Ben Coffman; 27.02.2012
comment
Отличный код. Не нужно было редактировать его, чтобы он работал или что-то в этом роде. Спасибо ~ - person James; 12.07.2012
comment
Полезно покрыть весь экран, как показано ниже: const int motionDistance = textField.frame.origin.y / 2; // настраиваем по мере необходимости - person conecon; 24.08.2012
comment
это не очень хорошо работает, когда пользователь переключает клавиатуру с обычной клавиатуры на международную клавиатуру, которая имеет другую высоту. - person xu huanze; 14.11.2012
comment
Я должен упомянуть, что если вы пишете приложение для iOS 4 или новее, вам следует вместо этого использовать блочные методы для анимации вашего контента. Ссылка на: developer.apple.com/library/ios/#documentation/windowsviews/. - person Mathieu; 07.01.2013
comment
Если у вас есть несколько текстовых полей и нужно только одно для анимации, добавьте тег в файл xib и поставьте оператор if перед операторами анимации if (textField.tag == 1) [self animateTextField: textField up: YES]; - person Jared Sealey; 05.02.2013
comment
Это прекрасно!! Ты обалденный! - person john doe; 08.05.2013
comment
Это отлично работает (с точки зрения значений анимации) для iPhone 4S на iOS 6.1.3 (экран Retina 3.5). - person Ken W; 10.06.2013
comment
По-прежнему отлично работает с iOS 7.0.3, спасибо за простое и элегантное решение. - person dreampowder; 27.11.2013
comment
По-прежнему работает на iOS 7.1 (iPad). Однако смещение не сохраняется после поворота, поэтому вам придется снова установить его в методе didRotateFromInterfaceOrientation. - person Hless; 17.03.2014
comment
Нашел это и обсуждает ту же проблему developer.apple.com/Library/ios/documentation/StringsTextFonts/ - person unom; 15.08.2014

Это творило чудеса для меня скользящие uitextfields

В частности, он позволяет рассчитывать расстояние анимации слайдов в зависимости от положения текстового поля.

person cidered    schedule 07.10.2009
comment
Отлично. Вам не нужно выбирать некоторую константу «расстояния перемещения» для каждого текстового поля - она ​​рассчитывается для вас. - person jlstrecker; 07.12.2011
comment
Лучшее решение на сегодняшний день. Феноменальный механизм! - person Marchy; 21.01.2012
comment
Прекрасно работает и на iPad. Я только что обновил PORTRAIT_KEYBOARD_HEIGHT = 264 и LANDSCAPE_KEYBOARD_HEIGHT = 352. Отличная ссылка. Спасибо. - person Khon Lieu; 10.01.2013
comment
Вышеупомянутая ссылка просто сделала мой день! Настолько прост в реализации, работает до сих пор безупречно! - person JimmyJammed; 19.02.2013
comment
Отлично работает, просто скопируйте и вставьте почти. Хорошее объяснение. - person Sandy; 14.05.2013
comment
Это лучшее объяснение по этой теме. В других руководствах используются представления таблиц, представления с прокруткой и т. Д. Это действительно работает, не вдаваясь в какие-либо другие сложности, простые и понятные. Спасибо, что поделились этим источником. - person Renexandro; 17.02.2014

IQKeyboardManager сделайте это за вас с помощью БЕЗ СТРОКИ КОДА, нужно только перетащить и перетащите связанный исходный файл в проект. IQKeyboardManager также поддерживает ориентацию устройства, автоматическое управление UIToolbar. , keyboardDistanceFromTextField и многое другое, чем вы думаете.

введите описание изображения здесь

Вот блок-схема управления: Блок-схема управления

Шаг 1: - добавлены глобальные уведомления о UITextField, UITextView и UIKeyboard в одноэлементном классе. Я назвал его IQKeyboardManager.

Шаг 2: - Если обнаружены UIKeyboardWillShowNotification, UITextFieldTextDidBeginEditingNotification или UITextViewTextDidBeginEditingNotification уведомления, попробуйте получить topMostViewController экземпляр из UIWindow.rootViewController иерархии. Чтобы правильно раскрыть _9 _ / _ 10_ на нем, необходимо отрегулировать рамку topMostViewController.view.

Шаг 3: - Расчетное ожидаемое расстояние перемещения topMostViewController.view по отношению к первому ответившему _13 _ / _ 14_.

Шаг 4: - Перемещение topMostViewController.view.frame вверх / вниз в соответствии с ожидаемым расстоянием перемещения.

Шаг 5: - Если обнаружено UIKeyboardWillHideNotification, UITextFieldTextDidEndEditingNotification или UITextViewTextDidEndEditingNotification уведомление, снова попробуйте получить topMostViewController экземпляр из UIWindow.rootViewController иерархии.

Шаг 6: - Расчетное расстояние topMostViewController.view с нарушением, которое необходимо восстановить в исходное положение.

Шаг 7: - Восстановлено topMostViewController.view.frame вниз в соответствии с нарушенным расстоянием.

Step8: - экземпляр класса singleton IQKeyboardManager при загрузке приложения, поэтому каждый UITextField / UITextView в приложении автоматически настроится в соответствии с ожидаемым расстоянием перемещения.

Это все

person Mohd Iftekhar Qurashi    schedule 17.07.2013
comment
Принятый ответ у меня не сработал. Но этот делает. - person learner; 02.08.2014
comment
@ZaEeMZaFaR IQKeyboardManager также оптимизирован для iPad. Не могли бы вы открыть проблему с репозиторием библиотеки github и загрузить демонстрационный проект, демонстрирующий проблему с iPad? - person Mohd Iftekhar Qurashi; 27.07.2015
comment
Спасибо за ответ. Я сделаю это, если проблема не исчезнет, ​​прежде чем вы комментируете, я думал, что IQKeyboardManager не для универсального устройства. - person ZaEeM ZaFaR; 27.07.2015
comment
Изучив больше, он отлично работает с iPad на симуляторе, но не на реальном устройстве iPad. Прекрасно работает и на iPhone (устройство + симулятор). В чем может быть проблема ? - person ZaEeM ZaFaR; 27.07.2015
comment
Как я уже говорил ранее, вы должны поднять проблему в репозитории github с демонстрационным проектом с информацией о вашей iOS и версии устройства, чтобы мы могли разобраться в проблеме. - person Mohd Iftekhar Qurashi; 27.07.2015
comment
Спасибо за помощь, я хотел опубликовать POC, где я обнаружил, что «разделенная клавиатура» была включена в системных настройках iOS. И это была проблема, из-за которой контроллер не мог прослушивать уведомления с клавиатуры. Сработало отлично, когда я отключил разделенную клавиатуру. - person ZaEeM ZaFaR; 19.08.2015
comment
Принятый ответ работает только тогда, когда вы устанавливаете делегата каждого UITextField. Этот фреймворк работает в любом UITextField, я думаю, что это лучшее решение на данный момент. - person Elvis Oliveira; 16.09.2015

Чтобы расширить ответ Amagrammer, вот образец класса:

LoginViewController.h

@interface LoginViewController : UIViewController <UITextFieldDelegate> {

}

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

Обратите внимание, что мы реализуем «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];
}
person stebooks    schedule 18.02.2012
comment
+1 за упоминание UIApplicationDidEnterBackgroundNotification, иначе он сдвинется вниз, если вы нажмете кнопку «Домой» и снова войдете в приложение, что сделает его некрасивым и глючным. - person Adil Soomro; 20.06.2013

Как насчет официального решения: Перемещение содержимого, расположенного под клавиатурой

Настройка содержимого обычно включает временное изменение размера одного или нескольких представлений и их расположение так, чтобы текстовый объект оставался видимым. Самый простой способ управлять текстовыми объектами с помощью клавиатуры - встроить их в объект UIScrollView (или один из его подклассов, например UITableView). Когда отображается клавиатура, все, что вам нужно сделать, это сбросить область содержимого в режиме прокрутки и прокрутить нужный текстовый объект на место. Таким образом, в ответ на UIKeyboardDidShowNotification ваш метод-обработчик сделает следующее:

  1. Получите размер клавиатуры.
  2. Отрегулируйте нижнюю вставку содержимого окна прокрутки по высоте клавиатуры.
  3. Прокрутите целевое текстовое поле в поле зрения.
// 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;
}
person Mars    schedule 12.02.2014
comment
Это официальное решение теперь заключено в элемент управления, см. Здесь: - stackoverflow.com/a/17707094/1582217 - person Mohd Iftekhar Qurashi; 10.04.2014
comment
Идея хороша, но свойство contentInset здесь не помогает, coz contentInset просто предоставит вам эффект заполнения: stackoverflow.com/a/ 10049782/260665 - person Raj Pawan Gumdal; 27.07.2014
comment
@Raj, Это может быть тот случай, когда я могу посмотреть на IQKeyboardManager, но до сих пор никто не открывает никаких проблем в официальном репозитории Github IQKeyboardManager относительно проблемы со свойством contentInset, поэтому я предполагаю, что это работает. - person Mohd Iftekhar Qurashi; 19.08.2014

У меня такая же проблема с UITableView ячейками textField. Я решил эту проблему, реализовав следующий метод прослушивания уведомления с клавиатуры.

Наблюдатель за уведомлениями здесь:

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

Обработайте эти уведомления с помощью функции ниже:

(void)keyboardWasShown:(NSNotification*)aNotification 
(void)keyboardWillBeHidden:(NSNotification*)aNotification 
person Boobalan    schedule 17.10.2011
comment
Ссылка не работает. Пожалуйста, подумайте о включении независимого решения в будущем! - person miek; 14.08.2013

Проверь это. Никаких хлопот для вас.

Это очень изящное решение. Все, что вам нужно сделать, это добавить текстовые поля в UIScrollView и изменить его класс на TPKeyboardAvoidingScollView, если вы используете раскадровки. Вид прокрутки расширен таким образом, что он обнаруживает, когда клавиатура видна, и перемещается над клавиатурой на разумном расстоянии. Это идеальное решение, потому что оно не зависит от вашего UIViewController. Все необходимое делается в рамках вышеупомянутого класса. Спасибо Майклу Тайсону и всем остальным.

TPKeyboardAvoiding

person Aruna    schedule 19.08.2011
comment
@NANNAV - Пожалуйста, комментируйте, когда вы вносите предложения по изменению ответа. - person Security Hound; 19.06.2013

Ниже представлена ​​быстрая версия ответа Амаграммера. Кроме того, вариант с использованием события UIKeyboardWillShowNotification, поскольку мне нужно было знать размер клавиатуры, прежде чем перемещать представление в сторону.

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)
}
person Justin Domnitz    schedule 11.11.2015

Было отличное пошаговое руководство по редактированию текстовых полей без затемнения (ссылка сейчас мертва, вот обратная ссылка: https://web.archive.org/web/20091123074029/http://acts-as-geek.blogspot.com/2009/11/editing-textfields-without-obscuring.html). Он показывает, как переместить существующий UIView на UIScrollView и автоматически прокрутить его при появлении клавиатуры.

Я немного обновил его, чтобы рассчитать правильную высоту для UIScrollView, когда есть элементы управления (например, UITabBar) ниже UIScrollBar. См. сообщение об обновлении uiview .

person GargantuChet    schedule 25.12.2009

Вот решение с использованием Xcode5, iOS7:

Используйте блоки UITextfieldDelegate и animation.

Это почти весь код для ViewController, но я хотел включить код делегата для тех, кто еще несколько незнаком с шаблоном делегата (например, я). Я также включил код, чтобы скрыть клавиатуру при нажатии вне текстового поля.

Вы можете перемещать представления (кнопки, текстовые поля и т. Д.) Настолько высоко, насколько хотите, просто не забудьте вернуть их на место (+100, затем -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];
}
person Ethan Parker    schedule 12.06.2014

Я предполагаю, что одним из способов было бы переместить всю позицию вашего представления с (x, y) на (x, y-keybaardHeight) при щелчке по текстовому полю и вернуть его, когда клавиатура отклонена, может выглядеть немного странно, поскольку представление просто всплывает (может, неплохо было бы его оживить).

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    CGRect frame=self.view.frame;
    frame.origin=CGPointMake(x...//set point here
    self.view.frame=frame;
}
person Daniel    schedule 07.08.2009
comment
Нет, это не так. Если пользователь коснется первого текстового поля, оно окажется над видимой областью. - person lolol; 12.10.2012

В дополнение к решению Amagrammer, если вы используете cocos2d в портретном режиме, измените эту строку:

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

к этому:

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

Если вы используете cocos2d в ландшафтном режиме, внесите указанные выше изменения и переключите значения up в textFieldDidBeginEditing: и textFieldDidEndEditing:

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

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

У меня была та же проблема, и GTKeyboardHelper показался мне простым выходом.

После перетаскивания фреймворка в проект включите файл заголовка. Загрузите и откройте пример проекта, затем перетащите объект «Помощник по клавиатуре» из раздела объектов в xib в раздел объектов в построителе интерфейса вашего проекта.

Перетащите все ваши представления, чтобы они были дочерними для «Помощника по клавиатуре».

person Andrei Nagy    schedule 25.04.2013

Фреймворк перетаскивания, который я использую в своих проектах. Поддерживает автоматическое закрытие при нажатии за пределами первого респондента или при прокрутке.

GTKeyboardHelper

person mackross    schedule 24.10.2011

Просто сдвиньте вид вверх и вниз по мере необходимости:

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

Не забудьте установить self как UITextFieldDelegate и как фактическое текстовое поле delegate.

(Спасибо Ammagrammer, это просто более короткий ответ с использованием блоков для анимации)

person dulgan    schedule 14.01.2014

Если хочешь, у меня есть кое-что еще. Дело в том, что вы хотите установить центр вашего UIView в текстовом поле, которое вы редактируете.

Перед этим вы должны сохранить свой INITIAL_CENTER как CGPoint из self.view.center и свой INITIAL_VIEW как CGRect из self.view.frame в свойстве const.

Вы можете создать такой метод:

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

Затем на своем UITextFieldDelegate необходимо вызвать centerOn: (CGRect) следующими способами:

textFieldDidBeginEditing: (UITextField *) с в качестве параметра рамкой текстового поля, на котором вы хотите центрировать.

И вы должны вызвать его в своем обработчике событий, где вы закрываете клавиатуру,

textFieldDidEndEditing: (UITextField *) может быть одним из способов сделать это, указав INITIAL_VIEW в качестве параметра centerOn: (CGRect).

person Jissay    schedule 27.02.2014

Я считаю, что в более новых версиях iOS (6.1+, возможно, даже раньше) базовое представление, по крайней мере для UITableView, автоматически сжимается при появлении клавиатуры. Таким образом, вам нужно только сделать текстовое поле видимым в этом представлении. В 1_:

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

тогда:

- (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];
}
person Lawrence Kesteloot    schedule 19.11.2014

https://github.com/ZulwiyozaPutra/Shift-Keyboard-Example Я надеюсь, что это решение помогло. Все они написаны на 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)
    }
    
}

person Zulwiyoza Putra    schedule 24.11.2016