Я пытаюсь построить экран ввода для iPhone. На экране есть несколько полей ввода. Большинство из них вверху экрана, но два поля находятся внизу. Когда пользователь пытается редактировать текст в нижней части экрана, клавиатура выскакивает и закрывает экран. Я нашел простое решение для перемещения экрана вверх, когда это происходит, но в результате экран всегда перемещается вверх, а поля в верхней части экрана становятся недоступными, когда пользователь пытается их отредактировать.
Есть ли способ заставить экран двигаться только при редактировании нижних полей?
Я использовал этот код, который я нашел здесь :
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)
}
func keyboardWillShow(sender: NSNotification) {
self.view.frame.origin.y -= 150
}
func keyboardWillHide(sender: NSNotification) {
self.view.frame.origin.y += 150
}
Ответы:
Ваша проблема хорошо объяснена в этом документе Apple . Пример кода на этой странице (в
Listing 4-1
) делает именно то, что вам нужно, он будет прокручивать ваш вид только тогда, когда текущее редактирование должно быть под клавиатурой. Вам нужно только поместить необходимые элементы управления в scrollViiew. Единственная проблема заключается в том, что это Objective-C, и я думаю, что он вам нужен в Swift .. так что ... вот оно:Объявить переменную
затем добавьте эти методы
Обязательно объявите ваш ViewController как
UITextFieldDelegate
и установите правильные делегаты в ваших методах инициализации: например:И не забудьте позвонить
registerForKeyboardNotifications
на viewInit иderegisterFromKeyboardNotifications
при выходе.Редактировать / обновить: синтаксис Swift 4.2
источник
UIKeyboardFrameEndUserInfoKey
вместоUIKeyboardFrameBeginUserInfoKey
, потому что последние возвращают высоту 0. И меняют точку попадания на нижнюю, а не на исходную.if let activeField = self.activeField { var point = activeField.frame.origin point.y += activeField.frame.size.height if (!aRect.contains(point)){ self.scrollView.scrollRectToVisible(activeField.frame, animated: true) } }
textField's didBeginEditing
метод вызывается ПОСЛЕ вызоваkeyboardWillShow
метода. В результатеactiveField
переменная все еще равна нулю, что означает, что никакой автоматической прокрутки не происходит. Мое решение состояло в том, чтобы поместитьactiveField = textField
вызов в метод textFieldshouldBeginEditing
. Это решает проблему порядка звонков.Вот мои 2 цента:
Вы пробовали: https://github.com/hackiftekhar/IQKeyboardManager
Чрезвычайно прост в установке Swift или Objective-C.
Вот как это работает:
IQKeyboardManager (Swift): - IQKeyboardManagerSwift доступен через CocoaPods, чтобы установить его, просто добавьте следующую строку в ваш Podfile: (# 236)
В AppDelegate.swift просто импортируйте структуру IQKeyboardManagerSwift и включите IQKeyboardManager.
И это все. Легко!
источник
IQKeyboardManager.shared.enable = true
Тот, который я нашел, чтобы работать идеально для меня, был этим:
Вы также можете изменить значения высоты. Удалите оператор if, если вы хотите использовать его для всех текстовых полей.
Вы даже можете использовать это для всех элементов управления, которые требуют пользовательского ввода, например TextView.
источник
У меня была похожая проблема, и я нашел довольно простое решение, не используя scrollView, а вместо этого использовал операторы if в методах keyboardWillShow / Hide.
Это было хорошее решение для меня, потому что у меня было только два текстовых поля.
Смещает весь вид вверх: только когда редактируются определенные текстовые поля (bottomText)
Сдвигает весь вид вниз: только когда вид не в исходном местоположении
источник
Просто используйте это расширение для перемещения любого UIView, когда клавиатура представлена.
Затем в вашем viewdidload привязать ваш взгляд к клавиатуре
источник
Почему бы не реализовать это в UITableViewController вместо этого? Клавиатура не будет скрывать текстовые поля, когда она отображается.
источник
Swift 4 (** обновлено ) с расширением **
inViewDidLoad
добавить следующее расширение
источник
Я использую SwiftLint, у которого было несколько проблем с форматированием принятого ответа. В частности:
нет пробела перед двоеточием, нет принудительного приведения, предпочитайте UIEdgeInset (top: etc ... вместо UIEdgeInsetMake.
так вот эти обновления для Swift 3
источник
Я думаю, что этот пункт не так:
Хотя источник activeField вполне может быть выше клавиатуры, maxY может не ...
Я бы создал точку 'max' для activeField и проверил, находится ли она на клавиатуре Rect.
источник
Вот моя версия после прочтения документации, предоставленной Apple, и предыдущих постов. Одна вещь, которую я заметил, - то, что textView не был обработан, когда покрыт клавиатурой. К сожалению, документация Apple не будет работать, потому что по какой-то причине клавиатура называется ПОСЛЕ вызова textViewDidBeginEditing. Я справился с этим, вызвав центральный метод, который проверяет, отображается ли клавиатура И редактируется ли textView или textField. Таким образом, процесс запускается только при наличии ОБА условий.
Еще одна особенность textViews заключается в том, что их высота может быть такой, что клавиатура обрезает нижнюю часть textView и не будет регулироваться, если была видна верхняя левая точка. Таким образом, код, который я написал, на самом деле берет указанную на экране нижнюю левую точку любого textView или textField и определяет, попадает ли он в привязанные к экрану координаты представленной клавиатуры, подразумевая, что клавиатура покрывает некоторую ее часть.
Если вы используете контроллер навигации, подкласс также устанавливает автоматическую настройку вида прокрутки для вставок в значение false.
Он проходит через каждый textView и textField, чтобы установить делегатов для обработки
Просто установите ваш базовый класс на подкласс, созданный здесь для результатов.
источник
Удивительные ответы уже даны, но это другой способ справиться с этой ситуацией (используя Swift 3x ):
Прежде всего, вызовите следующий метод в
viewWillAppear()
Теперь возьмите одно
IBOutlet
изUIView
главных ограничений,UIViewcontroller
например: (здесьUIView
есть подпредставление,UIScrollView
которое означает, что вы должны иметьUIScrollView
для всех вашихsubViews
)И другое переменная , как следующий и добавить делегат ИЭ
UITextFieldDelegate
:После этого вот волшебная часть, просто вставьте этот фрагмент ниже :
Теперь последний фрагмент:
Не забудьте установить делегат все
UITextField
с вUIStoryboard
Удачи!
источник
Синтаксис Swift 3:
это хороший метод, чтобы получить то, что вы хотите, вы можете добавить условия «если» для определенных текстовых полей, но этот тип работает для всех ... Надеюсь, это может быть полезно для всех
источник
Прежде всего объявите переменную, чтобы идентифицировать ваш активный UITextField.
Шаг 1:-
Как
var activeTextField: UITextField
?Шаг 2: - После этого добавьте эти две строки в viewDidLoad.
Шаг 3:-
Теперь определите эти два метода в вашем классе контроллера.
источник
Сделайте переменную uitextfield
В вашем представлении загружен
Знай текстовое поле, по которому щелкнули. вероятно, у вас есть текстовые поля на весь экран.
Проверьте, покрывает ли клавиатура текстовое поле или нет.
Вернуться, чтобы закрыть клавиатуру
ОБНОВЛЕНИЕ: NSNotification.Name.UIKeyboardWillShow & NSNotification.Name.UIKeyboardWillHide переименовываются в UIResponder.keyboardWillShowNotification & UIResponder.keyboardWillHideNotification соответственно.
источник
Swift : Вы можете сделать это, проверив, какой textField представлен.
источник
Этот код перемещается вверх по текстовому полю, которое вы редактируете, так что вы можете просмотреть его в Swift 3, для этого ответа вы также должны сделать свой вид UITextFieldDelegate:
И тогда в viewDidLoad:
Какие вызовы (вне viewDidLoad):
источник
Swift 3
источник
Принятый ответ почти идеален. Но мне нужно использовать
UIKeyboardFrameEndUserInfoKey
вместо того,UIKeyboardFrameBeginUserInfoKey,
чтобы последние возвращали keyborad высоту 0. И меняли точку попадания на нижнюю, а не на исходную.источник
Swift 4 Обновил мое решение
с ограничением анимации на клавиатуре показать / скрыть, наслаждайтесь.
источник
Swift 4
Вы можете легко перемещаться вверх и вниз
UITextField
с клавиатурой с анимациейисточник
Swift 4.2
Мое решение будет (вертикально) центрировать вид на
UITextField
если его положение находится под клавиатурой.Шаг 1. Создайте новый файл swift и
UIViewWithKeyboard
класс копирования-вставки .Шаг 2: В Интерфейсном Разработчике установите его как Пользовательский класс для вашего самого лучшего
UIView
.источник
Переписан для swift 4.2
В ViewDidLoad ..
Остальные функции
источник
«Я забыл упомянуть, что я новичок в Swift :( Какой будет правильный синтаксис, чтобы проверить это? (Как я могу получить имя поля в этой функции?)»
Хорошо . Сначала подтвердите протокол UITextFieldDelegate
Затем реализовать функцию
Следует отметить, что правильный подход - использовать представление прокрутки и поместить представление, которое должно быть смещено вверх / вниз, в представление прокрутки и соответствующим образом обрабатывать события клавиатуры.
источник
Для Swift 4.2
Этот код позволит вам контролировать момент оси Y кадра для определенного размера экрана устройства.
PS: этот код не будет разумно перемещать фрейм в зависимости от расположения TextField.
Создать расширение для UIDevice
Добавить NotificationObserver на viewDidLoad
селектор
источник