Моя цель - сделать так, чтобы текст в контейнере масштабировался в соответствии с его родителем. Это работает хорошо, когда контейнер содержит только одно текстовое представление, как показано ниже:
import SwiftUI
struct FontScalingExperiment: View {
var body: some View {
Text("Hello World ~!")
.font(.system(size: 500))
.minimumScaleFactor(0.01)
.lineLimit(1)
.padding()
.background(
RoundedRectangle(cornerRadius: 20)
.fill(Color.yellow)
.scaledToFill()
)
}
}
struct FontScalingExperiment_Previews: PreviewProvider {
static var previews: some View {
Group {
FontScalingExperiment()
.previewLayout(.fixed(width: 100, height: 100))
FontScalingExperiment()
.previewLayout(.fixed(width: 200, height: 200))
FontScalingExperiment()
.previewLayout(.fixed(width: 300, height: 300))
FontScalingExperiment()
.previewLayout(.fixed(width: 400, height: 400))
}
}
}
результат:

Однако, когда у нас более сложное представлениеМы не можем использовать тот же подход для автоматического масштабирования текста на основе его родительского размера, например:
import SwiftUI
struct IndicatorExperiment: View {
var body: some View {
VStack {
HStack {
Text("Line 1")
Spacer()
}
Spacer()
VStack {
Text("Line 2")
Text("Line 3")
}
Spacer()
Text("Line 4")
}
.padding()
.background(
RoundedRectangle(cornerRadius: 20)
.fill(Color.yellow)
)
.aspectRatio(1, contentMode: .fit)
}
}
struct IndicatorExperiment_Previews: PreviewProvider {
static var previews: some View {
Group {
IndicatorExperiment()
.previewLayout(.fixed(width: 100, height: 100))
IndicatorExperiment()
.previewLayout(.fixed(width: 200, height: 200))
IndicatorExperiment()
.previewLayout(.fixed(width: 300, height: 300))
IndicatorExperiment()
.previewLayout(.fixed(width: 400, height: 400))
}
}
}
Просто добавив эти 3 модификатора:
.font(.system(size: 500))
.minimumScaleFactor(0.01)
.lineLimit(1)
не приведет к результату, как в первом примере;Текст увеличен за рамкой. Я сделал это успешно, получаю желаемый результат с помощью GeometryReader, затем масштабирую размер шрифта на основе geometry.size.width
. Это единственный подход для достижения желаемого результата в SwiftUI?