Я использую Swift для программирования на iOS и использую этот код для перемещения UITextField
, но он не работает. Я keyboardWillShow
правильно вызываю функцию , но текстовое поле не двигается. Я использую autolayout.
override func viewDidLoad() {
super.viewDidLoad()
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillShow:"), name:UIKeyboardWillShowNotification, object: nil);
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillHide:"), name:UIKeyboardWillHideNotification, object: nil);
}
deinit {
NSNotificationCenter.defaultCenter().removeObserver(self);
}
func keyboardWillShow(notification: NSNotification) {
if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() {
//let contentInsets = UIEdgeInsets(top: 0, left: 0, bottom: keyboardSize.height, right: 0)
var frame = self.ChatField.frame
frame.origin.y = frame.origin.y - keyboardSize.height + 167
self.chatField.frame = frame
println("asdasd")
}
}
ios
swift
cocoa-touch
keyboard
uitextfield
Педро Манфреди
источник
источник
Ответы:
Есть несколько улучшений в существующих ответах.
Во-первых, UIKeyboardWillChangeFrameNotification , вероятно, является лучшим уведомлением, поскольку оно обрабатывает изменения, которые не просто отображают / скрывают, но изменяются из-за изменений клавиатуры (язык, использование сторонних клавиатур и т. Д.) И поворотов (но обратите внимание на комментарий ниже, указывающий, что клавиатура будет скрыта, следует также обрабатывается для поддержки аппаратного подключения клавиатуры).
Во-вторых, параметры анимации могут быть извлечены из уведомления, чтобы гарантировать, что анимации правильно вместе.
Вероятно, есть варианты очистить этот код немного больше, особенно если вы чувствуете себя уверенно с помощью принудительного развертывания кода словаря.
Свифт 3
(Отредактировано, чтобы учесть анимацию клавиатуры вне экрана вместо усадки, как описано в потрясающем комментарии @ Gabox ниже)
Swift 5
источник
endFrame?.size.height
не ноль. Я получил конец кадра какUIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 1024}, {768, 264}}";
. Запустил на iOS 8.3 iPad Симулятор, Портрет. Xcode6.3 beta4..UIKeyboardWillChangeFrame
не срабатывает при подключении аппаратной клавиатуры, даже если клавиатура iOS исчезает. Вы должны также наблюдать,.UIKeyboardWillHide
чтобы поймать этот крайний случай.Если вы используете Auto Layout, я предполагаю, что вы установили ограничение Bottom Space в Superview . Если это так, вам просто нужно обновить значение ограничения. Вот как вы делаете это с небольшой анимацией.
Жесткий код 20 добавляется только для того, чтобы немного вытолкнуть текстовое поле над клавиатурой. В противном случае верхнее поле клавиатуры и нижнее поле текстового поля будут соприкасаться.
Когда клавиатура отклонена, сбросьте значение ограничения до его первоначального значения.
источник
UIKeyboardWillShowNotification
уведомления. Посмотрите на код в вопросе ОП.animateWithDuration
и вызовитеself.view.layoutIfNeeded()
внутри блока animate.Простое решение состоит в том, чтобы переместить вид вверх с постоянной высотой клавиатуры.
Свифт 5:
источник
self.view.frame.origin.y -= 150
использоватьself.view.frame.origin.y = -150
и вместоself.view.frame.origin.y += 150
использованияself.view.frame.origin.y = 0
. Это предотвращает перемещение вида 150 каждый раз при касании нового поля.Для перемещения вашего вида во время редактирования текстового поля попробуйте это, я применил это,
Вариант 1: - ** ** Обновление в Swift 5.0 и iPhone X, XR, XS и XS Max Move с использованием NotificationCenter
Зарегистрировать это уведомление в
func viewWillAppear(_ animated: Bool)
Отменить регистрацию этого уведомления в
func viewWillDisappear(_ animated: Bool)
Примечание: - Если вы не отмените регистрацию, это вызовет дочерний класс и станет причиной сбоя или чего-либо еще.
Вариант 2: - Хорошо работает
Я получил этот ответ из этого источника UITextField двигаться вверх, когда клавиатура появляется в Swift
В Свифте 4 ---
источник
Я люблю чистый код Swift. Итак, вот самый трудный код, который я мог придумать, чтобы перемещать текстовое представление вверх / вниз с помощью клавиатуры. В настоящее время он работает в производственном приложении iOS8 / 9 Swift 2.
ОБНОВЛЕНИЕ (март 2016): я просто максимально сжал свой предыдущий код. Также есть множество популярных ответов, которые жестко задают высоту клавиатуры и параметры анимации. В этом нет необходимости, не говоря уже о том, что числа в этих ответах не всегда совпадают с фактическими значениями, которые я вижу на моем 6s + iOS9 (высота клавиатуры 226, продолжительность 0,25 и кривая анимации 7). В любом случае, почти нет лишнего кода, чтобы получить эти значения прямо из системы. Увидеть ниже.
ПРИМЕЧАНИЕ. Этот код охватывает большинство комментариев / общих случаев. Тем не менее, может потребоваться больше кода для обработки различных ориентаций и / или пользовательских клавиатур. Вот углубленная статья о работе с клавиатурой iOS. Если вам нужно разобраться с каждым сценарием, это может помочь.
источник
as
для принудительного приведения.as!
может сработать, но, как вы можете видеть в других местах на этой странице, я избегаю принудительного применения и принудительного разворачивания себя.baseConstraint
это может бытьbaseConstraint.constant = moveUp ? keyboardHeight : 0
вместоbaseConstraint.constant = moveUp ? -keyboardHeight : 0
.Изменить : я рекомендую более простое и чистое решение. Просто измените класс ограничения нижнего интервала на KeyboardLayoutConstraint . Он автоматически расширится до высоты клавиатуры.
Это улучшенная версия ответа @JosephLord.
Как протестировано на iOS 8.3 iPad Simulator, Portrait. Xcode6.3 beta4, я обнаружил, что его ответ не работает, когда клавиатура прячется, потому что
UIKeyboardFrameEndUserInfoKey
есть"NSRect: {{0, 1024}, {768, 264}}";
. Высота никогда0
.Это восходит к использованию традиционного
UIKeyboardWillShowNotification
иUIKeyboardWillHideNotification
позволяет лучше понять, когда клавиатура скрывается, а не полагается на высоту конечного фрейма.UIKeyboardWillShowNotification
также отправляется при смене рамки клавиатуры, поэтому она должна охватывать все случаи использования.источник
Я работаю со Swift 4, и я решил эту проблему без использования каких-либо дополнительных ограничений снизу, посмотрите мой код здесь. Это действительно работает над моим делом
1) Добавить наблюдателя уведомлений в загрузке
2) Удалить Notification Observer как
3) Добавить методы отображения / скрытия клавиатуры, такие как
4) Добавьте делегата textfeild и добавьте методы touchesBegan .usefull для скрытия клавиатуры при касании за пределами текстового поля на экране.
источник
UIKeyboardFrameEndUserInfoKey
NSNotification.Name.UIKeyboardWillShow
ПереименованоUIResponder.keyboardWillShowNotification
такжеUIKeyboardFrameBeginUserInfoKey
вUIResponder.keyboardFrameBeginUserInfoKey
Это улучшенная версия ответа @JosephLord и @ Hlung. Может применяться независимо от того, есть ли у вас панель вкладок или нет. И это прекрасно восстановит вид, который перемещен клавиатурой в исходное положение.
источник
Самый простой способ, который не требует никакого кода:
Объект будет автоматически перемещаться вверх с помощью клавиатуры, синхронно.
источник
Я создал протокол Swift 3 для обработки появления / исчезновения клавиатуры
Затем, чтобы реализовать его в UIViewController, сделайте следующее:
пусть viewController соответствует этому протоколу:
начните наблюдать изменения клавиатуры в viewWillAppear:
прекратить наблюдать изменения клавиатуры в viewWillDisappear:
создайте IBOutlet для нижнего ограничения из раскадровки:
(Я рекомендую встроить весь ваш пользовательский интерфейс в «contentView» и связать это свойство с нижним ограничением этого contentView с нижним руководством по компоновке)
изменить приоритет ограничения верхнего ограничения на 250 (низкий)
Это позволяет всему представлению контента скользить вверх, когда появляется клавиатура. Приоритет должен быть ниже, чем любой другой приоритет ограничения в подпредставлениях, включая приоритеты объятия контента / приоритеты сопротивления сжатию контента.
Возможно, вам придется добавить ограничение «больше чем равно» для этого:
И вот, пожалуйста!
источник
import UIKit
Такой простой
UIViewController
расширение можно использоватьПример использования
Swift 4 решение
Swift 4.2
источник
removeKeyboardObserver()
Метод здесь не удаляет наблюдателя. Если вы не вызываете это, вы увидитеInvalid conditions for UIKeyboardWillChangeFrameNotification
в консоли метод add. Если вы вызовете это, вы увидите ту же ошибку, означающую, что наблюдатель не удален. В документации говорится: «Чтобы отменить регистрацию наблюдений, вы передаете объект, возвращенный этим методомremoveObserver(_:)
». Вместо этого вы сохраняете объект, возвращенный этим методом, а затем передаете его, когда хотите удалить наблюдателя.Вы можете использовать эту библиотеку и всего одну строку кода в appDidFinishedLaunching, и все готово ..
IQKeyboardManager - настроить отображение при появлении ссылки на клавиатуре - https://github.com/hackiftekhar/IQKeyboardManager
источник
И наконец, так как мы используем методы делегатов
отказ от использования объектива-c http://www.cocoawithlove.com/2008/10/sliding-uitextfields-around-to-avoid.html
источник
var animateDistance: CGFloat!
плюс, я должен был обрабатывать UIKeyboardWillHideNotification, когда пользователь нажимает кнопку скрытия клавиатуры.Еще одно решение, которое не зависит от автоматического размещения, ограничений или каких-либо выходов. Что вам нужно, это ваши поля в прокрутки.
источник
UIKeyboardWillShowNotification
звонка.Вот моя версия решения для Swift 2.2:
Сначала зарегистрируйтесь для показа клавиатуры / скрытия уведомлений
Затем в методах, отвечающих за эти уведомления, переместите основной вид вверх или вниз.
Хитрость в части "keyboardWillShow", которая принимает звонки каждый раз, когда "Панель подсказок QuickType" раскрывается или сворачивается. Затем мы всегда устанавливаем координату y основного вида, которая равна отрицательному значению общей высоты клавиатуры (с частью «QuickType bar» или без нее).
В конце не забудьте убрать наблюдателей
источник
Ниже приведено простое решение, согласно которому текстовое поле имеет ограничение, связывающее его с нижним руководством по макету. Он просто добавляет высоту клавиатуры к константе ограничения.
источник
Ну, я думаю, что я мог бы опоздать, но я нашел другую простую версию ответа Сакиба. Я использую Autolayout с ограничениями. У меня есть небольшое представление внутри другого основного вида с полями имени пользователя и пароля. Вместо того, чтобы изменять координату y представления, я сохраняю исходное значение ограничения в переменной и изменяю константу ограничения на какое-то значение, и снова после того, как клавиатура отклоняется, я устанавливаю ограничение на исходное. Таким образом, это позволяет избежать проблемы, с которой сталкивается ответ Сакиба (вид продолжает двигаться вверх и не останавливается). Ниже мой код ...
источник
Ответ Swift 4.x, объединяющий ответы @Joseph Lord и @Isuru.
bottomConstraint
представляет нижнее ограничение представления, которое вы хотите переместить.источник
Я сделал следующим образом:
Это полезно, когда текстовое поле superview является просмотром
источник
источник
Я сделал следующим образом:
источник
Если вы похожи на меня, который перепробовал все вышеперечисленные решения, но ваша проблема не решена, у меня есть отличное решение для вас, которое работает как шарм. Сначала я хочу уточнить кое-что о некоторых решениях, упомянутых выше.
источник
Вот общее решение для всех шагов TextField -
1) Создайте общий ViewController, который расширяется другими ViewController
2) Создайте расширение UIViewController и текущего активного TextField.
расширение UIViewController {func getSelectedTextField () -> UITextField? {
}
источник
Очень просто и не нужно больше кодировать. Просто добавьте
pod 'IQKeyboardManagerSwift'
в ваш подфайл, и на вашейAppDelegate
странице добавьте код ниже.и в
didFinishLaunchingWithOptions()
типе методаэто оно проверьте эту ссылку на видео для лучшего понимания https://youtu.be/eOM94K1ZWN8 Надеюсь, это поможет вам.
источник
Полный код для управления клавиатурой.
источник
Я немного изменил решение @Simpa .........
источник
Ни один из них не работал, и я в конечном итоге использовал контентные вставки для перемещения моего взгляда вверх, когда появляется клавиатура.
Примечание: я использовал UITableView
Ссылочное решение @ клавиатура-контент-смещение полностью написанное в задаче C, ниже приведено чистое решение Swift.
Добавьте наблюдателя уведомления @ viewDidLoad ()
Чтобы получить размер клавиатуры, мы сначала получаем словарь userInfo из объекта уведомления, в котором хранятся любые дополнительные объекты, которые может использовать наш получатель.
Из этого словаря мы можем получить объект CGRect, описывающий кадр клавиатуры, используя ключ UIKeyboardFrameBeginUserInfoKey.
Примените вставку содержимого для метода табличного представления @ keyboardWillBeShown,
Восстановите метод view @ keyboardWillBeHidden
Если вы хотите учитывать ориентацию устройства, используйте условные операторы, чтобы адаптировать код к вашим потребностям.
источник
источник
Решение Swift 4, которое я использую, имеет размер клавиатуры. Замените
serverStatusStackView
на любой вид, который вас интересует, напримерself.view
:источник
Лучший способ - использовать NotificationCenter для отлова действий клавиатуры. Вы можете выполнить действия в этой короткой статье https://medium.com/@demirciy/keyboard-handling-deb1a96a8207
источник