SwiftUI中如何实现HeadingXLargeStyle自定义文本组件
解决SwiftUI中自定义文本直接调用的问题
问题分析
你想要实现HeadingXLargeStyle("ABCD")这种直接调用的自定义文本样式,之前尝试用UIViewRepresentable包装UITextView的方案存在以下问题:
- 没必要引入UIKit的
UITextView,SwiftUI原生Text完全能满足静态文本样式需求,反而会带来可编辑、滚动等不必要的属性,增加复杂度。 - 字体名称错误:
UIFont(name: "inter_bold.ttf", ...)中的.ttf后缀需要去掉,字体名称应该用注册后的PostScript名称(比如"Inter-Bold",可通过打印UIFont.familyNames和对应字体列表确认)。
推荐实现方案(纯SwiftUI)
直接定义一个遵循View协议的结构体,封装带样式的Text,这是最符合SwiftUI风格的做法:
struct HeadingXLargeStyle: View { let text: String init(_ text: String) { self.text = text } var body: some View { Text(text) .font(.custom("nunito_regular", size: 80)) // 可按需添加更多样式,比如字重、颜色、行高 // .fontWeight(.bold) // .foregroundColor(.black) } } // 调用方式 HeadingXLargeStyle("ABCD")
如果你坚持修复UIViewRepresentable的方案
如果一定要用UITextView,需要修正属性配置,确保它表现为静态文本:
struct HeadingXLargeStyle: UIViewRepresentable { let text: String init(_ text: String) { self.text = text } func makeUIView(context: Context) -> UITextView { let textView = UITextView() // 禁用编辑、滚动,清除背景色 textView.isEditable = false textView.isScrollEnabled = false textView.backgroundColor = .clear // 修正字体名称 textView.font = UIFont(name: "inter_bold", size: 40) textView.text = text return textView } func updateUIView(_ uiView: UITextView, context: Context) { uiView.text = text // 确保文本更新时字体也同步 uiView.font = UIFont(name: "inter_bold", size: 40) } }
内容的提问来源于stack exchange,提问作者JSONParser
相关产品推荐
相关产品推荐

