У меня есть uitextview с фиксированной шириной и высотой.
Чтобы сделать текст более удобочитаемым, я хотел выполнить «анимацию» посимвольного набора текста и смог заставить ее работать с помощью объекта Timer.
Моя единственная проблема заключается в том, что... когда первый символ вводится для слова, которое перейдет на следующую строку, вместо того, чтобы вводить этот первый символ в следующей строке, он печатает в текущей строке. Когда ввод достигает конца uitextview, только тогда все ранее набранные символы слова переносятся на следующую строку.
В результате анимация набора текста становится прерывистой, и мне интересно, можно ли вообще сделать ее более плавной, заранее набрав первый символ с новой строки. Любые рекомендации будут очень признательны!
Вот моя текущая функция:
func type(text: String) {
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.alignment = .center
paragraphStyle.lineBreakMode = .byWordWrapping
paragraphStyle.paragraphSpacing = 10
let bodyAttributes = [
NSAttributedString.Key.foregroundColor: UIColor.black,
NSAttributedString.Key.paragraphStyle: paragraphStyle,
NSAttributedString.Key.font: UIFont.systemFont(ofSize: 17)
]
let characters = Array(text)
var characterIndex = 0
let attributedString = NSMutableAttributedString()
Timer.scheduledTimer(withTimeInterval: 0.05, repeats: true) { [weak self] timer in
guard let self = self else { return }
while characters[characterIndex] == " " {
attributedString.append(NSAttributedString(string: " ", attributes: bodyAttributes))
textView.attributedText = attributedString
characterIndex += 1
if characterIndex == characters.count {
timer.invalidate()
return
}
}
let char = String(characters[characterIndex])
attributedString.append(NSAttributedString(string: char, attributes: bodyAttributes))
textView.attributedText = attributedString
characterIndex += 1
if characterIndex == characters.count {
timer.invalidate()
}
}
}
Re: Ответ Навита, результат:





func type(text: String, into textView: UITextView) {
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.alignment = .left
paragraphStyle.lineBreakMode = .byWordWrapping
paragraphStyle.paragraphSpacing = 10
let bodyAttributes: [NSAttributedString.Key: Any] = [
.foregroundColor: UIColor.black,
.paragraphStyle: paragraphStyle,
.font: UIFont.systemFont(ofSize: 17)
]
var characterIndex = 0
let attributedString = NSMutableAttributedString(attributedString: textView.attributedText ?? NSAttributedString())
Timer.scheduledTimer(withTimeInterval: 0.05, repeats: true) { timer in
guard characterIndex < text.count else {
timer.invalidate()
return
}
let currentCharacter = text[text.index(text.startIndex, offsetBy: characterIndex)]
let characterString = String(currentCharacter)
attributedString.append(NSAttributedString(string: characterString, attributes: bodyAttributes))
textView.attributedText = attributedString
let range = NSRange(location: 0, length: attributedString.length)
let boundingRect = attributedString.boundingRect(with: CGSize(width: textView.frame.width, height: .greatestFiniteMagnitude), options: [.usesLineFragmentOrigin, .usesFontLeading], context: nil)
if boundingRect.height > textView.bounds.height {
// If the text has overflowed to the next line, move to the next line
attributedString.append(NSAttributedString(string: "\n", attributes: bodyAttributes))
textView.attributedText = attributedString
}
characterIndex += 1
}
}
Я обновил код в соответствии с требованиями, пожалуйста, проверьте и дайте мне знать, работает ли он. загрузка видео
Ре -
Эй, спасибо! позволь мне проверить
Посмотрите также видео @Chris https: // we. tl / t - 0wY5CW63KG объедините этот URL, удалив пробелы
Я протестировал обновленный код и все еще вижу ту же проблему, а также странное поведение новой строки, когда я обновил изображение в своем сообщении. Кроме того, предоставленное вами изображение отражает мою проблему, когда, например, «Ваш» разделен на первую и вторую строки как «Вы» и «р». «текст» — это «текс» и «т». «здесь» — это «он» и «ре».
Вот обновление, которое вы можете обновить -> ParagraphStyle.lineBreakMode = .byWordWrapping, в моем случае теперь слова не разбиваются. добавление обновленного изображения в мой ответ
Спасибо за обновление. Я попробовал последнюю функцию, которую вы опубликовали, и все еще сталкиваюсь с той же проблемой.
обнаружил репозиторий , который создает пользовательские uitextview
оцените ответ. Я попытался интегрировать, но заметил странное поведение, когда символы слов разделены на две строки... обновленный пост с тестовым снимком экрана для справки!