我正在使用自定义字体(双体船),它似乎在行之间有很大的空间。例如,我有以下代码:
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文件吗?为什么这个字体中的行之间有这个空格?
谢谢你的帮助
发布于 2021-07-07 14:46:51
SwiftUI可以使用hhea (水平标头表)的值来设置Text框的高度。在你的例子中,双体船的上升幅度为1100,下降幅度为540。盒高将作为这两个值之和计算:540 + 1100 = 1640。并且字体的UPM (单位单位)是默认的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)!)发布于 2022-01-12 15:58:51
https://stackoverflow.com/questions/68229689
复制相似问题