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

SwiftUI设置富文本字体后工具栏文本省略号及对齐问题咨询

解决SwiftUI Toolbar中AttributedString设置字体后出现省略号且对齐异常的问题

解决方案1:正确合并HTML属性与自定义字体

直接给AttributedString设置font属性会覆盖HTML转换生成的原有样式(比如颜色),同时可能导致Toolbar布局时错误计算文本宽度,触发省略号。正确的做法是通过NSMutableAttributedString合并字体属性,保留原有HTML样式:

修改onAppear中的文本处理逻辑:

.onAppear {
    let string = "<div><p><span style=\"color:#FF0000;\">Hello World</span></p></div>"
    guard let data = string.data(using: .utf8),
          let nsAttrStr = try? NSAttributedString(data: data, options: [
              .documentType: NSAttributedString.DocumentType.html,
              .characterEncoding: String.Encoding.utf8.rawValue
          ], documentAttributes: nil) else {
        return
    }
    
    // 转换为可变属性字符串,合并字体样式
    let mutableAttrStr = NSMutableAttributedString(attributedString: nsAttrStr)
    let fullRange = NSRange(location: 0, length: mutableAttrStr.length)
    // 设置目标字体,保留原有颜色等HTML属性
    let targetFont = UIFont.preferredFont(forTextStyle: .body).bold()
    mutableAttrStr.addAttribute(.font, value: targetFont, range: fullRange)
    
    // 转换回SwiftUI的AttributedString
    displayText = try? AttributedString(mutableAttrStr, including: \.uiKit)
}

此方法既保留了HTML中的颜色样式,又正确应用了自定义字体,Toolbar中的文本能正常计算宽度,不会出现省略号,且与其他按钮对齐正常。

解决方案2:调整Toolbar文本的布局约束与对齐

如果需要保留直接设置AttributedString.font的方式,可以通过fixedSize配合对齐指南解决省略号和对齐偏移问题:

修改Toolbar中的Text组件:

ToolbarItem(placement: .principal) {
    Text(displayText ?? "")
        .fixedSize(horizontal: true, vertical: false) // 允许文本横向完整展示,避免省略号
        .alignmentGuide(.toolbarPrincipal) { dimension in
            dimension[.center] // 强制与Toolbar内其他元素垂直居中对齐
        }
}

逻辑说明

  • fixedSize(horizontal: true)禁用文本横向截断,确保内容完整显示;
  • alignmentGuide(.toolbarPrincipal)手动指定垂直对齐基准,抵消fixedSize导致的文本垂直偏移,保证与"Done"按钮水平居中对齐。

内容的提问来源于stack exchange,提问作者tech_human

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 22:33:20