UITextView в UIViewRepresentable: установка для isScrollEnabled значения false нарушает макетIOS

Программируем под IOS
Ответить
Anonymous
 UITextView в UIViewRepresentable: установка для isScrollEnabled значения false нарушает макет

Сообщение Anonymous »

У меня есть UITextView внутри UIViewRepresentable, поэтому я могу использовать его в SwiftUI ScrollView. Я использую встроенный размер контента, чтобы установить рамку контента. Это отлично работает, пока я не установил для .isScrollEnabled в UITextView значение false - в этот момент внутренний размер контента больше не работает. Я пытаюсь избежать другой альтернативы макета, где мне приходится вычислять и устанавливать размер кадра — это решение со встроенными функциями намного лучше. Но я не могу обойти .isScrollEnabled, сломав его. Вот код:

Код: Выделить всё

struct MainView: View {
var body: some View {
ScrollView {
SimpleTextView(text: loremIpsum)
.frame(minHeight: 10)
.border(.red)
SimpleTextView(text: loremIpsum)
.frame(minHeight: 10)
.border(.red)
SimpleTextView(text: loremIpsum)
.frame(minHeight: 10)
.border(.red)
}
}
}
UITextView:

Код: Выделить всё

struct SimpleTextView: UIViewRepresentable {
@State
private var attributedText: NSAttributedString?
var text: String

func makeUIView(context: Context) -> UITextView {
let view = ContentTextView()
view.setContentHuggingPriority(.required, for: .vertical)
view.setContentHuggingPriority(.required, for: .horizontal)
view.isSelectable = true
view.isEditable = false
view.isScrollEnabled = true
view.isUserInteractionEnabled = true
return view
}

func updateUIView(_ uiView: UITextView, context: Context) {
guard let attributedText = attributedText else {
generateAttributedText()
return
}
uiView.attributedText = attributedText
uiView.invalidateIntrinsicContentSize()
}

private func generateAttributedText() {
guard attributedText == nil else { return }
DispatchQueue.main.async {
self.attributedText = NSAttributedString(string: text, attributes: [:])
}
}

private class ContentTextView: UITextView {
override var canBecomeFirstResponder: Bool { false }

override var intrinsicContentSize: CGSize {
frame.height > 0 ? contentSize : super.intrinsicContentSize
}
}
}
Вывод, когда isScrollEnabled имеет значение true:
Изображение

Когда isScrollEnabled имеет значение false, я просто получаю пустую страницу.
Спасибо за любую помощь.< /п>

Подробнее здесь: https://stackoverflow.com/questions/791 ... eaks-the-l
Ответить

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

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

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

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

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