我有这样的UITextView包装器,它可以工作,但是当我将其放在List行中时。我希望它自动调整大小,即在这种情况下,其宽度与父级匹配,即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
}