首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在SwiftUI中固定自定义字体中的行距

在SwiftUI中固定自定义字体中的行距
EN

Stack Overflow用户
提问于 2021-07-02 18:13:37
回答 2查看 3K关注 0票数 8

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

代码语言:javascript
复制
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文件吗?为什么这个字体中的行之间有这个空格?

谢谢你的帮助

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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来降低线条高度:

代码语言:javascript
复制
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) { }
}

用法:

代码语言:javascript
复制
CustomText(text: "Foggy Days\nGo Nowhere",
           font: UIFont(name: "Catamaran", size: 1000)!)
票数 12
EN

Stack Overflow用户

发布于 2022-01-12 15:58:51

行距

使用:

代码语言:javascript
复制
Font.system(size: 16, weight: .regular, design: .rounded)
.leading(.tight)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68229689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档