SwiftUI 大小以适应使用 GeometryReader 的字体,字体太大

SwiftUI size to fit Font using GeometryReader, font is too big

我正在使用 GeometryReader 计算字体大小以适应多行文本,但它总是太大。我的计算有什么问题吗?

这是一个简单的游乐场

import SwiftUI
import PlaygroundSupport

struct MainView : View {
    
    var body: some View {
        VStack {
            SomeView()
                .frame(width: 508.0, height: 246.5)
        }
    }
}

struct SomeView: View {
    
    let newData = ["1", "2", "3", "4", "5", "6", "7", "8"]
    var lines: Int { newData.count }
    
    var body: some View {
        
        GeometryReader { geometry in
            VStack(alignment: .leading, spacing: 0) {
                ForEach(0..<lines) { idx in
                    Text(newData[idx])
                        .padding(0)
                }
            }
            .font(.system(size: geometry.size.height / CGFloat(lines)))
            .onAppear {
                print(geometry.size)
                print(lines)
                print(geometry.size.height / CGFloat(lines))
            }
        }
    }
}

PlaygroundPage.current.setLiveView(MainView())

这给了我这个结果:

GeometryReader 正确报告框的高度为 246.5,行数为 8,这导致 30.8125 字体大小。

字体大小似乎需要一些额外的填充,但我该如何计算呢?

我希望能够提供未知数量的数据并将其填满方框。 (好吧,我实际上正在使用遇到同样问题的 LazyVGrid)。

字体大小不等于此文本在屏幕上显示的大小。查看 this answer

您可以使用 lineHeightUIFont 获得实际行高,并使用此值可以计算您的行高所需的字体大小:

let expectedLineHeight = geometry.size.height / CGFloat(lines)
let fontSize = expectedLineHeight * expectedLineHeight / UIFont.systemFont(ofSize: expectedLineHeight).lineHeight
...
.font(.system(size: fontSize))