Swiftui UitextView прыгает в верхнюю часть при наборах и текстовых переворотах на новую линиюIOS

Программируем под IOS
Ответить
Anonymous
 Swiftui UitextView прыгает в верхнюю часть при наборах и текстовых переворотах на новую линию

Сообщение Anonymous »

У меня есть пользовательский uitextView, завернутый в Swiftui с использованием uiviewResentable.
Цель состоит в том, чтобы иметь динамическое представление текста высоты, которое растет как типы пользователей.
Вот упрощенная версия моего кода: < /p>
import SwiftUI

struct ContentView: View {
@State private var text = populateText()
@State private var minHeight: CGFloat = 36
private let lineLimit: Int = 0

var body: some View {
NavigationStack {
ScrollView {
DynamicTextView(
text: $text,
font: UIFont.systemFont(ofSize: 16),
linesLimit: lineLimit
)
.frame(minHeight: minHeight)
.overlay {
RoundedRectangle(cornerRadius: 8)
.stroke(Color.gray, lineWidth: 1)
}
.padding()
}
}
}
}

struct DynamicTextView: UIViewRepresentable {
@Binding var text: String

let font: UIFont
let linesLimit: Int

private var isScrollEnabled: Bool {
linesLimit > .zero ? true : false
}

func makeUIView(context: Context) -> UITextView {
let textView = CustomTextView()
textView.delegate = context.coordinator
textView.font = font
textView.text = text
textView.backgroundColor = .clear
textView.textContainer.lineFragmentPadding = 0
textView.textContainerInset = .init(top: 8, left: 8, bottom: 8, right: 8)
textView.isScrollEnabled = isScrollEnabled
return textView
}

func updateUIView(_ uiView: UITextView, context: Context) {
if uiView.text != text {
uiView.text = text
}
}

func sizeThatFits(_ proposal: ProposedViewSize, uiView: UITextView, context: Context) -> CGSize? {
let width = proposal.width ?? uiView.bounds.width

let fitting = CGSize(width: width, height: .greatestFiniteMagnitude)
let calculatedHeight = uiView.sizeThatFits(fitting).height

var height = calculatedHeight

if linesLimit > 0 {
let lineHeight = font.lineHeight
let maxHeight = lineHeight * CGFloat(linesLimit) + uiView.textContainerInset.top + uiView.textContainerInset.bottom
height = min(maxHeight, calculatedHeight)
}

return CGSize(width: width, height: height)
}

func makeCoordinator() -> Coordinator {
Coordinator(self)
}

class Coordinator: NSObject, UITextViewDelegate {
var parent: DynamicTextView

init(_ parent: DynamicTextView) {
self.parent = parent
}

func textViewDidChange(_ textView: UITextView) {
parent.text = textView.text
}
}
}

final class CustomTextView: UITextView {
init() {
super.init(frame: .zero, textContainer: nil)
}

required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}

#Preview {
ContentView()
}

func populateText() -> String {
var text = ""
for _ in 0..
Проблема: < /p>
При наводе длинного текста, если система автоматически завершает текст на новую строку, весь текстовый содержимое на мгновение возвращается к вершине. но прыжки очень заметен.
Вопрос: < /p>
Почему uitextview внутри Swiftui прыгает на вершину, когда текст переворачивается на новую строку, и как я могу это исправить, чтобы текст оставался стабильным во время печати? < /p>

Подробнее здесь: https://stackoverflow.com/questions/797 ... a-new-line
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»