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

使用自定义字体Zapfino时文本截断问题求助

修复SwiftUI中自定义字体(Zapfino)文本截断问题

在SwiftUI中使用Zapfino这类装饰性自定义字体时,常出现部分字符(比如示例中的"f")被截断的情况,即便文本框本该随内容自动扩展,显式设置frame也无法解决。你的代码如下:

Text(name)
    .font(Font.custom("Zapfino", size: 48, relativeTo: .title))
    .foregroundColor(Color.white)
    .baselineOffset(48)
    .padding(10)
    .background(Color.red)

示例文本“Test-f”显示截断

这是因为Zapfino的特殊字形设计(比如超长的下行线)超出了标准字体的度量范围,SwiftUI的自动布局系统没能正确识别完整的字形边界。以下是几种可行的修复方案:

  • 使用fixedSize()强制适配内容
    给Text添加fixedSize()修饰符,让视图根据文本的实际字形尺寸来布局,不会截断超出默认边界的部分:

    Text(name)
        .font(Font.custom("Zapfino", size: 48, relativeTo: .title))
        .foregroundColor(Color.white)
        .baselineOffset(48)
        .fixedSize()
        .padding(10)
        .background(Color.red)
    
  • 调整字体排版度量
    通过自定义UIFont的行间距或字形属性,让系统正确识别字体的完整边界。先扩展UIFont添加调整方法:

    extension UIFont {
        func withTraits(traits: UIFontDescriptor.SymbolicTraits) -> UIFont {
            guard let descriptor = self.fontDescriptor.withSymbolicTraits(traits) else {
                return self
            }
            return UIFont(descriptor: descriptor, size: 0)
        }
    }
    

    再创建调整后的字体用于SwiftUI:

    if let uiFont = UIFont(name: "Zapfino", size: 48) {
        let adjustedFont = uiFont.withTraits(traits: .traitLooseLeading)
        Text(name)
            .font(Font(adjustedFont))
            .foregroundColor(Color.white)
            .baselineOffset(48)
            .padding(10)
            .background(Color.red)
    }
    
  • 修正baselineOffset并增加padding
    你设置的baselineOffset(48)可能改变了文本的布局位置,导致下行部分被截断。可以适当减小偏移量,或者针对性增加底部padding:

    Text(name)
        .font(Font.custom("Zapfino", size: 48, relativeTo: .title))
        .foregroundColor(Color.white)
        .baselineOffset(32) // 调整偏移值
        .padding(.vertical, 15) // 增加垂直方向padding,重点保证底部空间
        .background(Color.red)
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 03:20:23