У меня есть приложение с текстовым полем в нижней части экрана. Это означает, что когда я иду печатать в текстовом поле, клавиатура закрывает текстовое поле.
Как бы я переместил вид вверх при наборе текста, чтобы я мог видеть то, что я печатаю, а затем переместил его обратно на исходное место, когда клавиатура исчезла?
Я искал повсюду, но все решения, похоже, в Obj-C, которые я пока не могу полностью преобразовать.
Любая помощь будет принята с благодарностью.
ios
swift
uikit
nsnotificationcenter
uikeyboard
Алекс Кетчпол
источник
источник
it is actually needed to scroll view up when keyboard appears
Ответы:
Вот решение без обработки переключения с одного textField на другое:
Чтобы решить эту проблему, замените две функции
keyboardWillShow/Hide
этими:РЕДАКТИРОВАТЬ ДЛЯ SWIFT 3.0:
РЕДАКТИРОВАТЬ ДЛЯ SWIFT 4.0:
РЕДАКТИРОВАТЬ ДЛЯ SWIFT 4.2:
источник
UIKeyboardFrameEndUserInfoKey
а неUIKeyboardFrameBeginUserInfoKey
при получении размера клавиатуры. Я не уверен, почему на данный момент, но первый даст более последовательные результаты.UIKeyboardFrameBeginUserInfoKey
наUIKeyboardFrameEndUserInfoKey
. Первый дает начальный кадр клавиатуры, который иногда равен нулю, а второй дает конечный кадр клавиатуры.Самый простой способ, который даже не требует никакого кода:
Объект будет автоматически перемещаться вверх с помощью клавиатуры, синхронно.
источник
DispatchQueue.main.async {}
чтобы исправить это. Хорошая работа! Недурно!Один из популярных ответов в этой теме использует следующий код:
Существует очевидная проблема со смещением вашего взгляда на статическую величину. Он будет хорошо смотреться на одном устройстве, но будет плохо смотреться на конфигурации любого другого размера. Вам нужно получить высоту клавиатуры и использовать ее в качестве значения смещения.
Вот решение, которое работает на всех устройствах и обрабатывает крайний случай, когда пользователь при вводе текста скрывает предиктивное текстовое поле.
Решение
Важно отметить, что мы передаем self.view.window в качестве нашего параметра объекта. Это предоставит нам данные с нашей клавиатуры, такие как ее высота!
Мы сделаем так, чтобы это выглядело хорошо на всех устройствах, и рассмотрим случай, когда пользователь добавляет или удаляет интеллектуальное текстовое поле.
Удалить наблюдателей
Не забудьте удалить своих наблюдателей, прежде чем покинуть вид, чтобы предотвратить передачу ненужных сообщений.
Обновление на основе вопроса из комментариев:
Если у вас есть два или более текстовых поля, вы можете проверить, равен ли ваш view.frame.origin.y нулю.
источник
Добавьте это к вашему viewcontroller. Работает как шарм. Просто настройте значения.
источник
Я немного улучшил один из ответов, чтобы он работал с разными клавиатурами и различными текстовыми представлениями / полями на одной странице:
Добавить наблюдателей:
Удалить наблюдателей:
источник
Не реклама или продвижение или спам , просто хорошее решение. Я знаю, что на этот вопрос есть почти 30 ответов, и я настолько потрясен, что никто даже не упомянул об этом прекрасном проекте GitHub, который делает все это для вас и даже лучше. Все ответы просто перемещают взгляд вверх. Я только что решил все свои проблемы с этим IQKeyboardManager. У него 13000+ звезд.
Просто добавьте это в ваш подфайл, если вы используете swift
а затем внутри вашего AppDelegate.swift сделать
import IQKeyboardManagerSwift
Добавьте строку,
IQKeyboardManager.shared.enable = true
чтобы включить его.Это решение обязательно, если вы собираетесь в производство.
источник
import IQKeyboardManager
и использовалIQKeyboardManager.shared().isEnabled = true
в AppDelegateДля ошибки черного экрана (Swift 4 и 4.2) .
Я исправил проблему с черным экраном. В проверенном решении Высота клавиатуры изменяется после нажатия, и это вызывает черный экран.
Должен использовать UIKeyboardFrameEndUserInfoKey вместо UIKeyboardFrameBeginUserInfoKey
источник
Я вижу, что все ответы перемещают само представление на величину высоты клавиатуры. Ну, у меня есть сложный ответ, который может быть полезен, если вы используете ограничения, т.е.
autolayout
Е. Перемещаете представление путем изменения его значения ограничения (например, нижнего или верхнего ограничения) на предварительно определенное значение или вы можете использовать значение размера клавиатуры.В этом примере я использую нижнее ограничение из текстового поля в Bottom Layout View с начальным значением 175.
источник
В том, как мы определяем KeyboardWillHideNotification, произошли некоторые изменения.
Это решение работает с Swift 4.2 :
источник
После 4-5 часов борьбы я пришел с простым расширением UIViewController с простым кодом, который работает как шарм
* Вид не должен двигаться, когда TextField находится над клавиатурой
* Нет необходимости устанавливать постоянное значение NSLayoutConstraint
* Не требуется сторонняя библиотека
* Не требуется анимационный код
* Работает и над таблицей
* Это работает на автоматическом макете / автоматическое изменение размера
Добавьте это расширение UIResponder, чтобы узнать, какой TextField выбран
Тогда используйте это в любом вашем ViewController
Зарегистрировать это уведомление в
func viewWillAppear(_ animated: Bool)
Отменить регистрацию этого уведомления в
func viewWillDisappear(_ animated:Bool)
Скачать демо здесь
источник
Для Swift 3 я сделал подкласс UIViewController, так как мне нужно было постоянное поведение во всех контроллерах представления.
источник
Подтвержденный ответ не учитывает позицию текстового поля и имеет некоторую ошибку (двойное смещение, никогда не возвращаться к исходной позиции, смещение, даже если текстовое поле находится над видом ...)
Идея заключается в следующем:
тогда мы сможем перемещать вид только в случае необходимости и определенного смещения в oder, чтобы сфокусированное поле texField над клавиатурой
Вот код:
Swift 4
}
источник
Я заметил, что другие ответы включали вырезание некоторых из верха из вида. Если вы хотите просто изменить размер представления, не обрезая содержимое, попробуйте этот метод :)
источник
Мои два цента для начинающих: в приведенных выше примерах кто-то меняет координаты, кто-то использует «маску авторазмера» и другие ограничения:
Как говорит Apple, не смешивайте эти 3 типа логики. Если у вас есть ограничения в раскадровке, не пытайтесь изменить х / у. Это определенно не работает.
источник
Таким образом, ни один из других ответов, кажется, не понял это правильно.
Хорошая клавиатура для iOS должна:
Мой код использует
NSLayoutConstraint
объявленный как@IBOutlet
Вы также можете использовать преобразования, просматривать смещения, .... Я думаю, что это проще с ограничением tho. Он работает, устанавливая ограничение снизу, вам может потребоваться изменить код, если ваша константа не равна 0 / Не снизу.
Вот код:
источник
его 100% идеальный ответ для всех парней обновления высоты стола при открытой клавиатуре
Для Swift4.2
Swift3.2
источник
Для Swift 3
источник
Свифт 4:
У меня возникла проблема с наиболее приемлемым ответом, из-за которой скрытие клавиатуры не возвращало представление полностью вниз страницы (только частично). Это сработало для меня (+ обновлено для Swift 4).
источник
Аналогично ответу @Boris, но в Swift 5 :
источник
Вот мое решение (на самом деле этот код предназначен для случая, когда в вашем представлении мало текстовых полей, это работает и для случая, когда у вас есть одно текстовое поле)
источник
Обновлено для Swift 3 ...
Как уже говорили другие, вам нужно добавить наблюдателей уведомлений в методе viewDidLoad () вашего контроллера, вот так:
Не забудьте удалить своих наблюдателей, где это необходимо (я делаю это в методе viewWillDisappear ())
Затем реализуйте свои методы show и hide - обратите внимание на строку, которая указывает приложению игнорировать события взаимодействия (beginIgnoringInteractionEvents). Это важно, так как без него пользователь может нажать на поле или даже прокрутку и вызвать сдвиг во второй раз, что приведет к ужасному сбою пользовательского интерфейса. Игнорирование событий взаимодействия до отображения и скрытия клавиатуры предотвратит это:
Наконец, повторно включите взаимодействие с пользователем (помните, этот метод срабатывает после того, как клавиатура didShow или didHide):
источник
Код Swift 3
источник
Если у вас есть 2 или более текстовых поля в одном и том же VC, и пользователь нажимает на одно из них, а затем на другое, не вызывая функцию keyboardWillHide, представление снова идет вверх, что не является необходимым, поскольку у вас будет клавиатура, пустое пространство с высотой клавиатуры и вид, используя код в ответе, который я отредактировал:
Чтобы решить эту проблему, замените две функции «KeyboardWillShow / Hide» на эти:
источник
Решение Бориса ОЧЕНЬ хорошее, но иногда вид может быть искажен.
Для идеального выравнивания используйте код ниже
Функции:
И,
источник
этот видеоурок самый лучший. 7 минут, и это будет иметь смысл. Такое простое решение для случаев, когда у вас есть несколько текстовых полей и вы хотите, чтобы представление прокрутки перемещало количество пикселей на «х» при касании этого конкретного текстового поля.
https://youtu.be/VuiPGJOEBH4
Просто эти шаги:
Поместите все ваши текстовые поля в скроллвью, который ограничен краями вида.
-Подключите все текстовые поля и прокрутите представление как делегаты к контроллеру представления.
-Соедините все текстовые поля и прокрутите представление с IBOutlet.
-Добавить протокол UITextFieldDelegate в ваш класс
-Добавить методы UITextFieldDelegate в ваш файл swift:
Первый способ просто активирует кнопку возврата на клавиатуре, чтобы убрать клавиатуру. Второй - когда вы нажимаете на любое конкретное текстовое поле, затем устанавливаете смещение y того, как далеко прокручивается ваше представление прокрутки (мое основано на местоположении y на контроллерах моего представления 25, 57, 112, 142). Последний говорит, что когда вы нажимаете в сторону от клавиатуры, просмотр прокрутки возвращается в исходное положение.
Таким образом, я сделал свой пиксель зрения идеальным!
источник
Эта функция должна быть встроена в Ios, однако мы должны сделать это извне.
Вставьте приведенный ниже код
* Чтобы переместить представление, когда textField находится под клавиатурой,
* Не перемещать представление, когда textField находится над клавиатурой
* Чтобы переместить View, основываясь на высоте клавиатуры, когда это необходимо.
Это работает и проверено во всех случаях.
| :: | Иногда View будет вниз, в этом случае используйте высоту +/- 150:
источник
оно должно быть более стабильным
источник
источник
Используйте следующий код для просмотра вверх на UITextField нажал
источник
Я сделал Cocoapod, чтобы упростить вопрос:
https://github.com/xtrinch/KeyboardLayoutHelper
Как это использовать:
Сделайте автоматическое расположение нижнего ограничения, присвойте ему класс KeyboardLayoutConstraint в модуле KeyboardLayoutHelper, и модуль выполнит всю работу, необходимую для его увеличения, чтобы он соответствовал появившейся и исчезающей клавиатуре. Смотрите пример проекта на примерах, как его использовать (я сделал два: textFields внутри scrollView и вертикально центрированные textFields с двумя основными представлениями - login & register).
Ограничение нижнего макета может касаться вида контейнера, самого textField и всего, что вы назовете.
источник