Получение и установка положения курсора UITextField и UITextView в Swift
Я экспериментировал с UITextField
и как работать с позицией курсора. Я нашел несколько ответов Objective-C отношения, как в
- Получение позиции курсора UITextField в ios
- Управление положением курсора в UITextField
- UITextField получить редактируемое слово
Но так как я работаю со Swift, я хотел узнать, как получить текущее положение курсора, а также установить его в Swift.
Ответ ниже - результат моих экспериментов и перевода с Objective-C.
5 ответов
Этот ответ был обновлен для Swift 3
Следующее содержание относится к обоим UITextField
а также UITextView
,
Полезная информация
Самое начало текстового поля текста:
let startPosition: UITextPosition = textField.beginningOfDocument
Самый конец текстового поля текста:
let endPosition: UITextPosition = textField.endOfDocument
Текущий выбранный диапазон:
let selectedRange: UITextRange? = textField.selectedTextRange
Получить позицию курсора
if let selectedRange = textField.selectedTextRange {
let cursorPosition = textField.offset(from: textField.beginningOfDocument, to: selectedRange.start)
print("\(cursorPosition)")
}
Установить позицию курсора
Чтобы установить положение, все эти методы фактически устанавливают диапазон с одинаковыми начальными и конечными значениями.
К началу
let newPosition = textField.beginningOfDocument
textField.selectedTextRange = textField.textRange(from: newPosition, to: newPosition)
К концу
let newPosition = textField.endOfDocument
textField.selectedTextRange = textField.textRange(from: newPosition, to: newPosition)
На одну позицию слева от текущей позиции курсора
// only if there is a currently selected range
if let selectedRange = textField.selectedTextRange {
// and only if the new position is valid
if let newPosition = textField.position(from: selectedRange.start, offset: -1) {
// set the new position
textField.selectedTextRange = textField.textRange(from: newPosition, to: newPosition)
}
}
На произвольную позицию
Начните с начала и переместите 5 символов вправо.
let arbitraryValue: Int = 5
if let newPosition = textField.position(from: textField.beginningOfDocument, offset: arbitraryValue) {
textField.selectedTextRange = textField.textRange(from: newPosition, to: newPosition)
}
связанные с
Выделить весь текст
textField.selectedTextRange = textField.textRange(from: textField.beginningOfDocument, to: textField.endOfDocument)
Выберите диапазон текста
// Range: 3 to 7
let startPosition = textField.position(from: textField.beginningOfDocument, offset: 3)
let endPosition = textField.position(from: textField.beginningOfDocument, offset: 7)
if startPosition != nil && endPosition != nil {
textField.selectedTextRange = textField.textRange(from: startPosition!, to: endPosition!)
}
Вставить текст в текущей позиции курсора
textField.insertText("Hello")
Заметки
использование
textField.becomeFirstResponder()
выделить фокус на текстовое поле и заставить клавиатуру появляться.Посмотрите этот ответ о том, как получить текст в некотором диапазоне.
Смотрите также
В моем случае мне пришлось использовать DispatchQueue:
func textViewDidBeginEditing(_ textView: UITextView) {
DispatchQueue.main.async{
textField.selectedTextRange = ...
}
}
больше ничего из этой и других тем не получалось.
PS: я дважды проверил, в каком потоке работает textViewDidBeginEditing, и это был основной поток, так как должен работать весь пользовательский интерфейс, поэтому не уверен, почему эта небольшая задержка при использовании main.asynch сработала.
let range = field.selectedTextRange
field.text = "hello world"
field.selectedTextRange = range
Для установки позиции курсора в вашей точке:
textView.beginFloatingCursor(at: CGPoint(x: 10.0, y: 10.0))
Для сброса позиции курсора:
textView.endFloatingCursor()
Примечание. Этот пример работает как в Textview, так и в Textfield.
Я даже не заметил, что textView в одном из моих опубликованных приложений фактически начинается слева после того, как вы удаляете слово в верхней строке textView. Не только курсор перемещался влево, но и текст начинался слева там, где он был, когда вы что-то вводили! Он не будет делать этого в средней или нижней строке, только когда строка была удалена наверху.
func textViewDidChange(_ textView: UITextView)
{
if myTextView.text!.count > 0
{
myTextView.textAlignment = .center
}
}
Каретка по-прежнему идет влево, что не идеально, но, по крайней мере, с добавленным оператором if он добавит текст только из центра, как задумано, и не будет добавлять текст слева.