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
您可以使用 lineHeight
从 UIFont
获得实际行高,并使用此值可以计算您的行高所需的字体大小:
let expectedLineHeight = geometry.size.height / CGFloat(lines)
let fontSize = expectedLineHeight * expectedLineHeight / UIFont.systemFont(ofSize: expectedLineHeight).lineHeight
...
.font(.system(size: fontSize))
我正在使用 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
您可以使用 lineHeight
从 UIFont
获得实际行高,并使用此值可以计算您的行高所需的字体大小:
let expectedLineHeight = geometry.size.height / CGFloat(lines)
let fontSize = expectedLineHeight * expectedLineHeight / UIFont.systemFont(ofSize: expectedLineHeight).lineHeight
...
.font(.system(size: fontSize))