6

我正在使用自定义字体(Catamaran),它的行之间似乎有很大的空间。例如我有这个代码:

Text("Example text that has big space between lines")
    .lineSpacing(0)
    .padding(.horizontal)
    .font(Font.custom(FontNameManager.Catamaran.bold, size: 24.0))
    .foregroundColor(.white)
    .multilineTextAlignment(.center)

它看起来像这样:

带有来自先前代码的文本示例的屏幕截图

正如你所看到的,它的行之间没有零空间,但它仍然有太多的空间。我什至尝试将负数设置为 lineSpacing 方法,但它没有帮助。我能用这个做什么?我该如何解决?在 UIKit 中,我可能会使用属性字符串,我想我可以使用 UILabel 作为 UIViewRepresentable,然后我可以在 SwiftUI iOS 14 中使用属性字符串。是否有一些更简单的解决方案可以“修复”任何使用的字体?我必须编辑原始 .ttf 文件吗?为什么这种字体的行之间有这个空格?

谢谢你的帮助

4

2 回答 2

8

SwiftUI 可能会使用hhea(Horizo​​ntal header table) 的值来设置Text框高度。在您的情况下,Catamaran 的上升器为 1100,下降器为 540。盒子高度将计算为这两个值的总和:540 + 1100 = 1640。字体的 UPM (Units per Em) 默认为1000。这意味着在 SwiftUI 中,当.font(.custom(..., size: 1000))设置时,每一行都Text()会有一个高度为1640的框架。

文本框高度

就 而言.lineSpacing(),SwiftUI 没有设置基线之间的间距值,而是设置两个框之间的间距。如果您希望在下面的示例中两个框之间没有间距,遗憾的是不允许设置.lineSpacing()-(1640-1000) = -640(不接受负值)。

设置与预期的行距

更新:一种UIViewRepresentable方法

但是,您可以UILabel改为使用来减少行高:

struct CustomText: UIViewRepresentable {
    let text: String
    let font: UIFont
    
    func makeUIView(context: Context) -> UILabel {
        let label = UILabel()
        
        label.font = font
        label.numberOfLines = 0
        
        let attributedString = NSMutableAttributedString(string: text)
        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.lineHeightMultiple = 0.6  // <- Reduce lineHeight with a <1 factor
        
        attributedString.addAttribute(NSAttributedString.Key.paragraphStyle,
                                      value: paragraphStyle,
                                      range: NSMakeRange(0, attributedString.length))
        
        label.attributedText = attributedString
        
        return label
    }
    
    func updateUIView(_ uiView: UILabel, context: Context) { }
}

用法:

CustomText(text: "Foggy Days\nGo Nowhere",
           font: UIFont(name: "Catamaran", size: 1000)!)
于 2021-07-07T14:46:51.930 回答
0

.leading似乎是您需要的东西(并且在印刷上是谈论“行距”的正确方式)。

采用:

Font.system(size: 16, weight: .regular, design: .rounded)
.leading(.tight)
于 2022-01-12T15:58:51.780 回答