У меня есть такая оболочка UITextView, и она работает, но когда я помещаю ее в строку списка. Я хотел бы, чтобы он автоматически изменял размер, то есть имел ширину, соответствующую родителю в этом случае List Row VStack {}, и высоту, которая автоматически изменялась в зависимости от длины текста. Текст должен обернуться. Теперь это почти работает, но более длинный текст, такой как URL, выходит за пределы доступной ширины строки.
List {
VStack(alignment: .leading) {
if self.hasNote {
TextView(text: text)
}
}
struct TextView: UIViewRepresentable {
// MARK: - Properties
let text: String
init(text: String) {
self.text = text
}
func makeUIView(context: Context) -> UITextView {
let textView = UITextView()
//textView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
textView.backgroundColor = UIColor.clear
textView.isScrollEnabled = false
textView.attributedText = self.attributedText
textView.textContainer.lineBreakMode = .byWordWrapping
//textView.layoutIfNeeded()
textView.sizeToFit()
return textView
}
}
ОБНОВЛЕНИЕ
Теперь у меня есть что-то вроде этого, оно подходит родительскому SwiftUI представления (строки в списке), но вместо этого он не переносит текст (или не растягивает по вертикали в зависимости от размера содержимого. При прокрутке он корректно переносит текст. Также, если я установил .frame (height: 500), я вижу, что он переносит текст. Но это не Неправильный размер.
func makeUIView(context: Context) -> UITextView {
let textView = UITextView()
textView.backgroundColor = UIColor.clear
textView.isScrollEnabled = false
textView.isSelectable = true
let linkAttrs : [NSAttributedString.Key : Any] = [
.foregroundColor: accentColor,
.underlineColor: accentColor,
.underlineStyle: NSUnderlineStyle.single.rawValue
]
textView.linkTextAttributes = linkAttrs
textView.attributedText = self.attributedText
textView.textContainer.lineBreakMode = .byWordWrapping
textView.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
textView.setContentCompressionResistancePriority(.defaultHigh, for: .vertical)
textView.setContentHuggingPriority(.defaultHigh, for: .horizontal)
textView.setContentHuggingPriority(.defaultLow, for: .vertical)
textView.sizeToFit()
return textView
}