我正在使用自定义字体(双体船 https://fonts.google.com/specimen/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 文件吗?为什么这种字体的行与行之间有这个空格?
谢谢你的帮助
SwiftUI 可能使用以下值hhea
(水平表头表)设置Text
盒子高度。在您的例子中,双体船的上升高度为 1100,下降高度为 540。盒子高度将计算为这两个值的总和:540 + 1100 = 1640。并且字体的UPM(Units per Em)是默认的1000。这意味着在 SwiftUI 中,当.font(.custom(..., size: 1000))
已设置,每一行Text()
将有一个高度为的框架1640.
按照.lineSpacing()
,SwiftUI 不设置基线之间的间距值,而是设置两个框之间的间距。如果您希望在下面的示例中两个框之间没有间距,不幸的是设置.lineSpacing()
to -(1640-1000) = -640
不允许(负值不可接受)。
更新:一个UIViewRepresentable
Method
但是,您可以使用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) { }
}
Usage:
CustomText(text: "Foggy Days\nGo Nowhere",
font: UIFont(name: "Catamaran", size: 1000)!)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)