You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 18:40:57