У меня есть пользовательский 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
Swiftui UitextView прыгает в верхнюю часть при наборах и текстовых переворотах на новую линию ⇐ IOS
Программируем под IOS
1757667322
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>
Подробнее здесь: [url]https://stackoverflow.com/questions/79762683/swiftui-uitextview-jumps-to-the-top-when-typing-and-text-wraps-to-a-new-line[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия