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
相关产品推荐
相关产品推荐

