SwiftUI - 文本 minimumScaleFactor 仅在需要时不缩放
SwiftUI - Text minimumScaleFactor not scaling only when needed
我有一个文本,当它的字符串长度超出视图时,我想用 .minimumScaleFactor(0.1)
修改它。但是,每次都会应用缩放,即使原始字体大小非常合适。
我的观点是这样构成的:
VStack(alignment: .center, spacing: 0) {
HStack {
Image("medal \(place)").resizable()
.foregroundColor(color)
.frame(width: 40, height: 40)
Spacer()
Text(username)
.font(.bold(16))
.lineLimit(1)
.minimumScaleFactor(0.1)
.frame(alignment: .trailing)
.foregroundColor(Color("mediumTextColor"))
}
Spacer()
Text(score)
.font(.extraBold(60))
.foregroundColor(color)
.lineLimit(1)
.minimumScaleFactor(0.7)
Spacer()
}
.frame(height: 96)
.padding(10)
.cornerRadius(16)
.overlay(RoundedRectangle(cornerRadius: 16)
.stroke(color, lineWidth: 2))
在您的文本中添加 .layoutPriority(1)
修饰符以确保它采用 space(如果有的话)。
在我的两个文本视图所在的 VStack 周围添加一个 GeometryReader 解决了这个问题。根据@gohnjanotis 的要求:
GeometryReader { proxy in
VStack(alignment: .center, spacing: 0) {
HStack {
Image("medal \(self.place)").resizable()
.foregroundColor(self.color)
.frame(width: 40, height: 40)
Spacer()
Text(self.username)
.minimumScaleFactor(0.1)
.font(.bold(16))
.lineLimit(1)
.frame(alignment: .trailing)
.foregroundColor(Color("mediumTextColor"))
.layoutPriority(1)
}
.padding(.top, 10)
.padding(.horizontal, 10)
Spacer()
Text(self.score)
.font(.extraBold(60))
.foregroundColor(self.color)
.lineLimit(1)
.minimumScaleFactor(0.1)
.layoutPriority(1)
.padding(.horizontal, 10)
.padding(.bottom, 10)
.offset(y: -10)
}
.frame(width: proxy.size.width, height: proxy.size.height, alignment: .top)
}
.frame(maxHeight: 130)
在文本中添加 .lineLimit(1)
效果很好。
Xcode: 11.3.1
上述回答的延续。
重要的是修饰符的应用顺序:
Text("This is a really long sentence.")
.minimumScaleFactor(0.5)
.font(.custom("OpenSans", size: 15))
.lineLimit(1)
.layoutPriority(1)
不需要 GeometryReader,除非您需要它来做其他事情
重要的是 minimumScaleFactor() 只在需要时才起作用,是 .minimumScaleFactor
和 .lineLimit(1)
的组合;否则它不会工作。 layoutPriority(1)
不是这里的关键。
示例 - 这行得通;仅在需要时应用比例:
Text("Something").minimumScaleFactor(0.5).lineLimit(1)
在尝试了很长时间解决这个问题之后...使用 minimumScaleFactor、LineLimit、layoutPriority...我发现使用 .frame() 有助于解决我的问题。
我的问题是 minimumScaleFactor 即使不需要也适用于文本。
在最后一行应用 .frame() 解决了我的问题。
像这样...
GeometryReader { geometry in
VStack{
Text("Hello")
.foregroundColor(Color.Black)
.font(.system(size: 50))
.minimumScaleFactor(0.1)
.lineLimit(1)
.frame(height: geometry.size.height)
}
}
我有一个文本,当它的字符串长度超出视图时,我想用 .minimumScaleFactor(0.1)
修改它。但是,每次都会应用缩放,即使原始字体大小非常合适。
我的观点是这样构成的:
VStack(alignment: .center, spacing: 0) {
HStack {
Image("medal \(place)").resizable()
.foregroundColor(color)
.frame(width: 40, height: 40)
Spacer()
Text(username)
.font(.bold(16))
.lineLimit(1)
.minimumScaleFactor(0.1)
.frame(alignment: .trailing)
.foregroundColor(Color("mediumTextColor"))
}
Spacer()
Text(score)
.font(.extraBold(60))
.foregroundColor(color)
.lineLimit(1)
.minimumScaleFactor(0.7)
Spacer()
}
.frame(height: 96)
.padding(10)
.cornerRadius(16)
.overlay(RoundedRectangle(cornerRadius: 16)
.stroke(color, lineWidth: 2))
在您的文本中添加 .layoutPriority(1)
修饰符以确保它采用 space(如果有的话)。
在我的两个文本视图所在的 VStack 周围添加一个 GeometryReader 解决了这个问题。根据@gohnjanotis 的要求:
GeometryReader { proxy in
VStack(alignment: .center, spacing: 0) {
HStack {
Image("medal \(self.place)").resizable()
.foregroundColor(self.color)
.frame(width: 40, height: 40)
Spacer()
Text(self.username)
.minimumScaleFactor(0.1)
.font(.bold(16))
.lineLimit(1)
.frame(alignment: .trailing)
.foregroundColor(Color("mediumTextColor"))
.layoutPriority(1)
}
.padding(.top, 10)
.padding(.horizontal, 10)
Spacer()
Text(self.score)
.font(.extraBold(60))
.foregroundColor(self.color)
.lineLimit(1)
.minimumScaleFactor(0.1)
.layoutPriority(1)
.padding(.horizontal, 10)
.padding(.bottom, 10)
.offset(y: -10)
}
.frame(width: proxy.size.width, height: proxy.size.height, alignment: .top)
}
.frame(maxHeight: 130)
在文本中添加 .lineLimit(1)
效果很好。
Xcode: 11.3.1
上述回答的延续。
重要的是修饰符的应用顺序:
Text("This is a really long sentence.")
.minimumScaleFactor(0.5)
.font(.custom("OpenSans", size: 15))
.lineLimit(1)
.layoutPriority(1)
不需要 GeometryReader,除非您需要它来做其他事情
重要的是 minimumScaleFactor() 只在需要时才起作用,是 .minimumScaleFactor
和 .lineLimit(1)
的组合;否则它不会工作。 layoutPriority(1)
不是这里的关键。
示例 - 这行得通;仅在需要时应用比例:
Text("Something").minimumScaleFactor(0.5).lineLimit(1)
在尝试了很长时间解决这个问题之后...使用 minimumScaleFactor、LineLimit、layoutPriority...我发现使用 .frame() 有助于解决我的问题。
我的问题是 minimumScaleFactor 即使不需要也适用于文本。
在最后一行应用 .frame() 解决了我的问题。
像这样...
GeometryReader { geometry in
VStack{
Text("Hello")
.foregroundColor(Color.Black)
.font(.system(size: 50))
.minimumScaleFactor(0.1)
.lineLimit(1)
.frame(height: geometry.size.height)
}
}