ios - поле - работа с клавиатурой swift

ios - поле - работа с клавиатурой swift

Как я могу заставить UITextField двигаться вверх, когда клавиатура присутствует? (20)

Для быстрых программистов:

Это сделает все для вас, просто поместите их в класс контроллера вида View и реализуйте UITextFieldDelegate на свой контроллер представления и установите делегат textField для self

Внедрить методы обратного вызова делегата:

У меня есть UIView с UITextField которые вызывают клавиатуру. Мне нужно это, чтобы иметь возможность:

Разрешить прокрутку содержимого UIScrollView для просмотра других текстовых полей после поднятия клавиатуры

Автоматически «прыгать» (путем прокрутки) или сокращения

Я знаю, что мне нужен UIScrollView . Я попытался изменить класс UIView на UIScrollView но я все еще не могу прокручивать текстовые поля вверх или вниз.

Нужен ли мне UIView и UIScrollView ? Один идет внутри другого?

Что необходимо реализовать, чтобы автоматически перейти к активному текстовому полю?

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

Примечание. UIView (или UIScrollView ), с которым я работаю, воспитывается на вкладке ( UITabBar ), которая должна функционировать как обычно.

Изменить: я добавляю полосу прокрутки только для клавиатуры. Даже если это не нужно, я чувствую, что он обеспечивает лучший интерфейс, потому что тогда пользователь может прокручивать и изменять текстовые поля, например.

У меня это работает, когда я изменяю размер кадра UIScrollView когда клавиатура идет вверх и вниз. Я просто использую:

Тем не менее, это не автоматически «продвигается» или сосредотачивается на нижние текстовые поля в видимой области, что мне бы очень понравилось.

Здесь я нашел простейшее решение для обработки клавиатуры.

Вам нужно просто скопировать-вставить ниже пример кода и изменить текстовое поле или любое представление, которое вы хотите переместить вверх.

Шаг 1

Просто скопируйте пасту ниже двух методов в вашем контроллере

Шаг 2

регистрировать и отменить регистрацию уведомлений клавиатуры в viewWillAppear и viewWillDisappear соответственно.

Шаг 3

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

Ссылка : ну, пожалуйста, оцените этот парень , который поделился этим красивым отрывом кода, чистым решением.

Надеюсь, это было бы очень полезно кому-то там.

В textFieldDidBeginEditting и в textFieldDidEndEditing вызовите функцию [self animateTextField:textField up:YES] следующим образом:

Надеюсь, этот код вам поможет.

Для универсального решения здесь был мой подход к реализации IQKeyboardManager .

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

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

Шаг 3: - Я вычислил ожидаемое расстояние перемещения topMostViewController.view отношении первого UITextField / UITextView .

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

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

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

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

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

Это все, что IQKeyboardManager делаю для IQKeyboardManager с NO LINE OF CODE ! нужно только перетащить связанный исходный файл в проект. IQKeyboardManager также поддерживает ориентацию устройств , автоматическое управление UIToolbar , KeybkeyboardDistanceFromTextField и многое другое, чем вы думаете.

На самом деле лучше всего использовать реализацию Apple, как это предусмотрено в docs . Однако код, который они предоставляют, неисправен. Замените часть, найденную в keyboardWasShown: чуть ниже комментариев к следующему:

Проблемы с кодом Apple следующие: (1) Они всегда вычисляют, находится ли точка в кадре представления, но это ScrollView , поэтому она может уже прокручиваться, и вам нужно учитывать это смещение:

(2) Они сдвигают contentOffset на высоту клавиатуры, но мы хотим наоборот (мы хотим сдвинуть contentOffset по высоте, которая видна на экране, а не в том, что нет):

У меня также возникла проблема с UIScrollView состоящим из нескольких UITextFields , из которых один или несколько из них будут закрыты клавиатурой при их редактировании.

Вот некоторые вещи, которые следует учитывать, если ваш UIScrollView неправильно прокручивается.

1) Убедитесь, что ваш contentSize больше размера кадра UIScrollView . Способ понять UIScrollViews состоит в том, что UIScrollView похож на окно просмотра содержимого, определенного в contentSize. Поэтому, когда для просмотра UIScrollview в любом месте, contentSize должен быть больше, чем UIScrollView . Кроме того, прокрутки не требуется, поскольку все, что определено в contentSize, уже видно. BTW, default contentSize = CGSizeZero .

2) Теперь, когда вы понимаете, что UIScrollView действительно является окном в вашем «контенте», способ обеспечить, чтобы клавиатура не скрывала ваше окно просмотра UIScrollView's было бы изменить размер UIScrollView чтобы при наличии клавиатуры вы имеют окно UIScrollView размер которого зависит от исходного кадра UIScrollView минус высота клавиатуры. Это гарантирует, что ваше окно будет только той небольшой видимой областью.

3) Вот улов: когда я впервые реализовал это, я решил, что мне нужно будет получить CGRect отредактированного UIScrollView's поля и вызвать метод scrollRecToVisible UIScrollView's . Я UITextFieldDelegate метод textFieldDidBeginEditing с вызовом метода scrollRecToVisible . Это действительно со странным побочным эффектом, что прокрутка будет привязать UITextField к позиции. В течение долгого времени я не мог понять, что это было. Затем я прокомментировал метод textFieldDidBeginEditing Delegate, и все это работает !! (. ). Как оказалось, я считаю, что UIScrollView фактически неявно выводит UITextField отредактированный UITextField в видимое окно неявно. Моя реализация метода UITextFieldDelegate и последующего вызова scrollRecToVisible была избыточной и была причиной странного побочного эффекта.

Итак, вот шаги для правильной прокрутки вашего UITextField в UIScrollView на место, когда появляется клавиатура.

  1. Зарегистрировать для уведомлений клавиатуры в viewDidLoad
  2. Отменить viewDidUnload клавиатурных nofitications в viewDidUnload
  3. Убедитесь, что contentSize установлен и больше, чем ваш UIScrollView в viewDidLoad
  4. Сжимайте UIScrollView когда клавиатура присутствует
  5. Верните обратно UIScrollView когда клавиатура уйдет.
  6. Используйте ivar, чтобы определить, отображается ли клавиатура на экране, поскольку уведомления о клавиатуре отправляются каждый раз, когда UITextField имеет UITextField даже если клавиатура уже присутствует, чтобы избежать сокращения UIScrollView когда она уже сжата

Следует отметить, что UIKeyboardWillShowNotification будет срабатывать, даже если клавиатура уже находится на экране, когда вы UITextField другой UITextField . Я позаботился об этом, используя ivar, чтобы избежать изменения размера UIScrollView когда клавиатура уже находится на экране. Неожиданное изменение размера UIScrollView когда клавиатура уже там, будет катастрофической!

Надеюсь, что этот код избавит некоторых из вас от головной боли.

developer.apple.com/library/ios/#documentation/StringsTextFonts/… документе описывается решение этой проблемы. Посмотрите исходный код в разделе «Перемещение содержимого, находящегося под клавиатурой». Это довольно просто.

EDIT: Заметил, что в этом случае есть ошибка. Возможно, вы захотите слушать UIKeyboardWillHideNotification вместо этого UIKeyboardDidHideNotification . В противном случае прокрутка позади клавиатуры будет обрезана на время анимации закрытия клавиатуры.

Swift 4 .

Вы можете легко перемещаться вверх и вниз UITextField или UIView с UIKeyBoard помощью Animation

Примечание : этот ответ предполагает, что ваш textField находится в scrollView.

Я предпочитаю иметь дело с этим, используя scrollContentInset и scrollContentOffset вместо того, чтобы возиться с рамками моего представления.

Сначала давайте прослушаем уведомления о клавиатуре

Следующий шаг - сохранить свойство, представляющее текущего первого ответчика (UITextfield / UITextVIew, который в настоящее время имеет клавиатуру).

Мы используем методы делегата для установки этого свойства. Если вы используете другой компонент, вам понадобится нечто подобное.

Обратите внимание, что для текстового поля мы устанавливаем его в файле doBeginEditing и для textView в shouldBeginEditing. Это связано с тем, что textViewDidBeginEditing вызывается после UIKeyboardWillShowNotification по какой-то причине.

Наконец, вот волшебство

Просто используя TextFields:

1a) Использование Interface Builder : выберите All TextFields => Edit => Embed In => ScrollView

1b) Встраивание текстовых полей вручную в UIScrollView с именем scrollView

2) Установить UITextFieldDelegate

3) Установите каждый textField.delegate = self; (или сделать соединения в Interface Builder )

4) Копировать / Вставить:

Используйте эту третью сторону, вам не нужно писать даже одну строку

скачать проект и перетащить IQKeyboardManager в ваш проект. Если вы обнаружили какую-либо проблему, прочитайте документ README.

Ребята действительно снимают головную боль, чтобы управлять клавиатурой.

Спасибо и удачи!

Небольшое исправление, которое работает для многих UITextFields

Это решение использует Swift.

попробуйте этот короткий трюк .

Был поиск хорошего учебника для начинающих по теме, нашел лучший учебник here .

В приведенном ниже MIScrollView.h примере учебника обязательно разместите

В соответствии с документами , начиная с iOS 3.0, UITableViewController класс автоматически изменяет размеры и перетаскивает свой вид таблицы при редактировании текстовых полей. Я думаю, что этого недостаточно, чтобы помещать текстовое поле внутри, UITableViewCell как указывали некоторые.

Контроллер табличного представления поддерживает встроенное редактирование строк таблицы; если, например, строки имеют встроенные текстовые поля в режиме редактирования, он прокручивает строку, редактируемую над отображаемой виртуальной клавиатурой.

Для перемещения рамки просмотра не требуется просмотр прокрутки. Вы можете изменить рамку viewcontroller's представления, чтобы весь вид перемещался настолько, чтобы помещать текстовое поле firstresponder над клавиатурой. Когда я столкнулся с этой проблемой, я создал подкласс, UIViewController который делает это. Он замечает, что на клавиатуре появится уведомление и обнаружит первый ответчик subview и (при необходимости) он оживляет основной вид вверх настолько, чтобы первый ответчик находился выше клавиатуры. Когда клавиатура скрывается, она оживляет вид назад, где он был.

Чтобы использовать этот подкласс, сделайте свой пользовательский контроллер представлений подклассом GMKeyboardVC и наследует эту функцию (просто убедитесь, что вы реализуете, viewWillAppear и viewWillDisappear они должны вызвать супер). Класс находится на github .

Когда UITextField находится в UITableViewCell прокруткой должен быть установлен автоматически.

Если это не так, возможно, из-за неправильного кода / настройки tableview.

Например, когда я перезагрузил свой длинный стол одним UITextField снизу следующим образом,

то мое текстовое поле внизу было закрыто клавиатурой, которая появилась, когда я щелкнул внутри текстового поля.

Чтобы исправить это, я должен был сделать это -

Следует рассмотреть вопрос о том, хотите ли вы когда-либо использовать UITextField его самостоятельно. Я не сталкивался с любыми хорошо разработанными приложениями для iPhone, которые фактически используются UITextFields за пределами UITableViewCells .

Это будет какая-то дополнительная работа, но я рекомендую вам реализовать все представления ввода данных в виде таблиц. Добавьте UITextView в свой UITableViewCells .

Там так много решений, но я потратил несколько часов до начала работы. Итак, я помещаю этот код здесь (просто вставьте в проект, никаких изменений не нужно):

PS: Я надеюсь, что код поможет кому-то сделать желаемый эффект быстро. (Xcode 4.5)

📎📎📎📎📎📎📎📎📎📎