在 SwiftUI View 中,我有几个 Text
HStack
中的元素.根据用户输入,不会有水平空间来显示所有文本。 HStack
通过确保所有 Text
是否工作正常元素获得相等的宽度并且字符串被截断。这一切都在预料之中,也应该如此。
问题是所有的字符串最后都用“...”截断,而我想要 UILabel.lineBreakMode = .byClipping
的行为,也就是说字符串应该简单地在 Text
的边缘被切断元素。
我如何实现这一目标?
编辑有关我想要的更多详细信息:
import SwiftUI
struct TextClipPoC: View {
var body: some View {
HStack {
textElm
textElm
textElm
textElm
}
}
var textElm: some View {
Text("abcdefghijklmn")
.padding(.all, 3)
.background(Color.yellow)
}
}
struct TextClipPoC_Previews: PreviewProvider {
static var previews: some View {
TextClipPoC()
.previewLayout(.fixed(width: 320, height: 40))
}
}
给出这个输出:我想要与上面完全相同的输出,除了“...”我想要文本只是剪辑。
如果我只是添加
.fixedSize()
到 HStack
(或到 Text
元素),正如解决方案中所建议的,我得到了这个结果:最佳答案
一种解决方案是覆盖相同 Text
的两个实例, 一个固定大小和一个正常大小,让正常大小决定大小并将其隐藏,然后将固定大小剪切。
可以用 ViewModfier
来完成:
struct FixedClipped: ViewModifier {
func body(content: Content) -> some View {
ZStack(alignment: .leading) {
content.hidden().layoutPriority(1)
content.fixedSize(horizontal: true, vertical: false)
}
.clipped()
}
}
extension View {
func fixedClipped() -> some View {
self.modifier(FixedClipped())
}
}
然后像这样使用:struct TextClipPoC: View {
var body: some View {
HStack {
textElm
textElm
textElm
}
}
var textElm: some View {
Text("abcdefghijklmn")
.padding([.leading, .trailing], 3)
.background(Color.yellow)
.fixedClipped()
}
}
struct TextClipPoC_Previews: PreviewProvider {
static var previews: some View {
TextClipPoC()
.previewLayout(.fixed(width: 320, height: 40))
}
}
这产生了这个结果:关于ios - 如何让 SwiftUI 文本剪辑而不是用点截断 (...),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62746684/