SwiftUI Button Text width violates borders,没有被HStack压缩
SwiftUI Button Text width violates borders, not compressed by HStack
我有一个带有文本和按钮的小型 HStack。这受限于 maxWidth: 200
import SwiftUI
struct ContentView: View {
var body: some View {
HStack {
Text("Some Text")
.frame(maxWidth: .infinity)
Button(action: {}, label: {
Text("A Very much to long button Text with more Text")
.truncationMode(.middle)
})
}.frame(maxWidth: 200)
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
这最终会缩放按钮甚至超出 HStack 的边界。
我不想在按钮标签文本上使用 .frame(maxWidth: 50
硬编码宽度。
在截断文本 (.truncationMode
)
之后,它应该尽可能多地使用 space
如果不使用 GeometryReader
如何做到这一点 以便结果看起来像:
更新
根据建议,XCode 在 macOS 11.6
上检查了最新的 13.2
似乎与 macOS 的已知问题有关。
唯一的解决办法是,创建自定义 ButtonStyle
并在那里应用必要的限制:
struct MacOSFixedButtonStyle: ButtonStyle {
func makeBody(configuration: Self.Configuration) -> some View {
configuration.label
.truncationMode(.middle)
.lineLimit(1)
}
}
extension View {
func fixedMacOSButton(
) -> some View {
self.buttonStyle(
MacOSFixedButtonStyle()
)
}
}
通过以下方式应用:
Button("to long to read it and to put it in a view", action: {})
.fixedMacOSButton()
我有一个带有文本和按钮的小型 HStack。这受限于 maxWidth: 200
import SwiftUI
struct ContentView: View {
var body: some View {
HStack {
Text("Some Text")
.frame(maxWidth: .infinity)
Button(action: {}, label: {
Text("A Very much to long button Text with more Text")
.truncationMode(.middle)
})
}.frame(maxWidth: 200)
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
这最终会缩放按钮甚至超出 HStack 的边界。
我不想在按钮标签文本上使用 .frame(maxWidth: 50
硬编码宽度。
在截断文本 (.truncationMode
)
如果不使用 GeometryReader
如何做到这一点 以便结果看起来像:
更新
根据建议,XCode 在 macOS 11.6
上检查了最新的 13.2似乎与 macOS 的已知问题有关。
唯一的解决办法是,创建自定义 ButtonStyle
并在那里应用必要的限制:
struct MacOSFixedButtonStyle: ButtonStyle {
func makeBody(configuration: Self.Configuration) -> some View {
configuration.label
.truncationMode(.middle)
.lineLimit(1)
}
}
extension View {
func fixedMacOSButton(
) -> some View {
self.buttonStyle(
MacOSFixedButtonStyle()
)
}
}
通过以下方式应用:
Button("to long to read it and to put it in a view", action: {})
.fixedMacOSButton()