这是一个解决方案,将文本大小调整代码隐藏在自定义修饰符中,该修饰符可应用于任何视图,而不仅仅是圆形,并采用一个参数指定文本应占据的视图比例。
(我不得不同意,虽然@szemian 的解决方案仍然不理想,但由于其他方法固有的问题,她的方法似乎是我们对当前 SwiftUI 实现所能做的最好的。@simibac 的答案需要摆弄才能找到一个新的每当文本或其属性(字体、粗细等)发生更改时替换 0.4 的幻数,并且 @giuseppe-sapienza 不允许指定圆圈的大小,只能指定文本的字体大小.)
struct FitToWidth: ViewModifier {
var fraction: CGFloat = 1.0
func body(content: Content) -> some View {
GeometryReader { g in
content
.font(.system(size: 1000))
.minimumScaleFactor(0.005)
.lineLimit(1)
.frame(width: g.size.width*self.fraction)
}
}
}
使用修饰符,代码变成了这样:
var body: some View {
Circle().strokeBorder(Color.red, lineWidth: 30)
.aspectRatio(contentMode: .fit)
.overlay(Text("Text")
.modifier(FitToWidth(fraction: fraction)))
}
此外,当 Xcode 的未来版本提供 SwiftUI 改进以消除 .minimumScaleFactor hack 时,您只需更新修饰符代码即可使用它。 :)
如果你想看看分数参数是如何工作的,下面的代码可以让你使用滑块进行交互调整:
struct ContentView: View {
@State var fraction: CGFloat = 0.5
var body: some View {
VStack {
Spacer()
Circle().strokeBorder(Color.red, lineWidth: 30)
.aspectRatio(contentMode: .fit)
.overlay(Text("Text")
.modifier(FitToWidth(fraction: fraction)))
Slider(value: $fraction, in:0.1...0.9, step: 0.1).padding()
Text("Fraction: \(fraction, specifier: "%.1f")")
Spacer()
}
}
}
这是它的样子: