如何让NSTextView正确显示AttributedString的属性样式?
自定义NSTextView无法渲染AttributedString颜色样式的问题
我通过NSViewRepresentable封装了一个自定义NSTextView:
struct CustomNSTextView: NSViewRepresentable { @Binding var text: AttributedString func makeNSView(context: Context) -> NSTextView { var textFrame: NSRect = NSRect(origin: CGPoint(x: 0, y: 0), size: CGSize(width: 2, height: 50)) var textView: NSTextView = NSTextView(frame: textFrame) textView.backgroundColor = .white return textView } func updateNSView(_ nsView: NSViewType, context: Context) { nsView.textStorage?.setAttributedString(NSAttributedString(text)) } }
接着我传入了一个带有蓝色标签样式的AttributedString:
struct PlaygroundView: View { @State private var test = transformText(string: "testing attributed string tag conversion. #tagging") var body: some View { CustomNSTextView(text: $test) } } func transformText(string: String) -> AttributedString { var aString = AttributedString(string) let splitString = string.split(separator: " ") let tags = splitString.filter { $0.hasPrefix("#") }.map(String.init) for tag in tags { if let range = aString.range(of: tag) { aString[range].foregroundColor = .blue } } return aString }
预期字符串中的#tagging会显示为蓝色,但实际所有文本都是黑色。不过将该AttributedString传入SwiftUI原生Text组件时,样式可以正常显示:


请问是不是遗漏了NSTextView的某些属性设置,才能让AttributedString正确渲染样式?
解决方法
问题根源在于NSTextView默认的textColor属性会覆盖富文本的颜色设置。当textColor不为nil时,NSTextView会将这个颜色统一应用到所有文本,忽略AttributedString中设置的局部颜色样式。
只需在创建NSTextView时,将textColor设为nil,让它遵循AttributedString中的样式即可:
func makeNSView(context: Context) -> NSTextView { let textFrame = NSRect(origin: .zero, size: CGSize(width: 2, height: 50)) let textView = NSTextView(frame: textFrame) textView.backgroundColor = .white textView.textColor = nil // 关键设置:取消默认文本颜色的覆盖 return textView }
如果你的文本不需要编辑,还可以额外设置textView.isEditable = false,避免用户修改内容,但这不是解决颜色问题的必需项。
SwiftUI的Text组件本身会完全遵循AttributedString的样式定义,因此不会出现这种覆盖问题。
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

