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

UILabel使用自定义字体出现文本截断问题求助

解决自定义波斯/阿拉伯字体(如IranNastaliq)在UILabel中字符截断的问题

我之前也碰到过类似的坑,像IranNastaliq这类带有书法风格的非拉丁字体,字形往往会超出常规字体的排版边界,系统默认的尺寸计算方法没法准确识别这些特殊的字形范围,才会出现手动放大Label能正常显示,但自动计算尺寸就截断的情况。给你几个亲测有效的解决方案:

1. 用boundingRect(with:options:context:)替代默认尺寸计算方法

sizeThatFits()和attributedString.size()对于特殊字体的支持不够友好,改用boundingRect并指定合适的选项,能更精准地计算文本的实际渲染范围。修改后的代码如下:

let string = "کیخسروی"
let font = UIFont(name: "IranNastaliq", size: 30)!
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineBreakMode = .byWordWrapping
paragraphStyle.alignment = .center
let attributes: [NSAttributedString.Key: Any] = [
    .font: font,
    .paragraphStyle: paragraphStyle
]
let attributedString = NSAttributedString(string: string, attributes: attributes)

// 使用boundingRect计算准确的文本尺寸
let maxSize = CGSize(width: CGFloat.greatestFiniteMagnitude, height: CGFloat.greatestFiniteMagnitude)
// 关键:添加.usesLineFragmentOrigin和.usesFontLeading选项
let textRect = attributedString.boundingRect(with: maxSize,
                                             options: [.usesLineFragmentOrigin, .usesFontLeading],
                                             context: nil)

// 注意:boundingRect返回的是浮点值,建议向上取整避免像素级截断
let labelWidth = ceil(textRect.width)
let labelHeight = ceil(textRect.height)

let label = UILabel(frame: CGRect(x: 0, y: 0, width: labelWidth, height: labelHeight))
label.attributedText = attributedString
label.backgroundColor = .yellow
label.textAlignment = .center

self.myView.addSubview(label)
label.center = self.myView.center

这里的.usesLineFragmentOrigin让计算基于文本的实际行片段布局,.usesFontLeading会考虑字体自带的行间距和字形上下偏移,这两个选项是针对特殊字体尺寸计算的关键。

2. 手动添加内边距补偿

如果某些极端情况下boundingRect还是不够精准,可以给Label添加内边距,直接预留足够的空间容纳超出的字形:

方法一:直接设置contentEdgeInsets

label.contentEdgeInsets = UIEdgeInsets(top: 8, left: 4, bottom: 8, right: 4)

数值可以根据你的字体实际显示效果调整,比如Nastaliq字体上下延伸较多,就适当加大top和bottom的数值。

方法二:自定义Label子类重写intrinsicContentSize

如果需要在多个地方使用这种字体的Label,自定义子类会更方便:

class NastaliqLabel: UILabel {
    override var intrinsicContentSize: CGSize {
        var originalSize = super.intrinsicContentSize
        // 根据字体情况额外增加高度
        originalSize.height += 16
        return originalSize
    }
}

3. 检查字体文件的完整性

有时候字体文件本身的元数据有问题,比如字形的边界框定义不准确,也会导致系统计算错误。你可以用Mac上的Font Book打开字体文件,查看字形的显示范围是否正常,如果字体文件有损坏,尝试重新下载或使用官方版本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:07:03