I've been able to render NSAttributedString
s via UIViewRepresentable
which works great until I wrap the view in a ScrollView
.
When placed inside the ScrollView
, the NSAttributedString
view stops rendering.
I've tried some other methods that replace an NSAttributedString
with adding multiple Text()
views together to get formatting which works inside the ScrollView
and supports italics and monospace font
. Unfortunately this doesn't work for links inside text blocks, which means I still need an NSAttributedString
.
import SwiftUI
struct TextWithAttributedString: UIViewRepresentable {
var attributedString: NSAttributedString
init(_ attributedString: NSAttributedString) {
self.attributedString = attributedString
}
func makeUIView(context: Context) -> UITextView {
let textView = UITextView(frame: .zero)
textView.attributedText = self.attributedString
textView.isEditable = false
return textView
}
func updateUIView(_ textView: UITextView, context: Context) {
textView.attributedText = self.attributedString
}
}
let exampleText = """
Fugiat id blanditiis et est culpa voluptas. Vivamus aliquet enim eu blandit blandit. Sit eget praesentium maxime sit molestiae et alias aut.
"""
struct NSAttributedStringView: View {
var body: some View {
// Note: when uncommented, the view breaks
// ScrollView {
TextWithAttributedString(NSAttributedString(string: exampleText))
// }
}
}
struct NSAttributedStringView_Previews: PreviewProvider {
static var previews: some View {
NSAttributedStringView()
.previewLayout(.sizeThatFits)
}
}
Edit: I tried using the wrapped UITextView
with the text
property set instead of the attributeText
property, but this also fails to render in the ScrollView
, so the issue seems to be the UITextView
, not the NSAttributedString
.
So the question is, how do we get the UITextView
to work in a ScrollView
?
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…