VStack 中的文本在 SwiftUI 中不应该截断时被截断
Text inside a VStack truncates when it's not supposed to in SwiftUI
我正在尝试在 VStack
中创建一个简单的 Text
堆栈,无论我做什么,文本都会截断而不是换行,即使我明确设置 lineLimit(nil)
(虽然我知道这是现在的默认值)。
我试过在 VStack 的第一个元素上设置 layoutPriority(1)
,我也试过按照其他一些帖子的建议设置 frame(idealHeight: .greatestFiniteMagnitude)
,但似乎没有什么可以解决这个问题。
以下是实际问题的视频:
下面是一些重现问题的代码:
import SwiftUI
struct BugRepro: View {
@State var length: Double = 1.0
var body: some View {
VStack {
ForEach(0..<3) { i in
BugReproElement(index: i)
}
.background(Color.gray3)
.frame(width: UIScreen.main.bounds.width * CGFloat(length))
Slider(value: $length, in: 0.0...1.0)
}
}
}
struct BugRepro_Previews: PreviewProvider {
static var previews: some View {
BugRepro()
}
}
struct BugReproElement: View {
var index: Int
var body: some View {
Text("iaush isuh siudh siudh isudh isudhdsiu sdiuh sdihs")
.foregroundColor(.gray7)
.frame(minWidth: 0, maxWidth: .infinity, alignment: .leading)
}
}
这可能只是 Xcode 中的错误吗?我是 运行 Beta 7
不幸的是这是一个错误。
您可以使用一种解决方法来强制它重新计算元素,但这只是一种解决方法,您必须等待发布并查看它是否已修复。
解决方法
在ForEach
.
的内容上下添加一对高度为zero的间隔符
struct BugRepro: View {
@State var length: Double = 1.0
var body: some View {
VStack {
ForEach(0..<3) { i in
Spacer().frame(height: 0)
BugReproElement(index: i)
Spacer().frame(height: 0)
}.frame(width: UIScreen.main.bounds.width * CGFloat(length))
Slider(value: self.$length, in: 0.0...1.0)
}
}
}
我想出了如何让文本正确呈现。
在此处应用答案有效:
关键是确保 .fixedSize()
在 .frame()
之前添加
不需要Spacer()
!
.fixedSized
必须在 .font()
之前添加才能为我工作。
我必须添加 .fixedSize(horizontal: false, vertical: true)
AND .padding()
在我的所有文本停止截断(正确显示在视图中)之前我还有一个框架标签一个单独的 vstack(我在视图中有 2 个单独的 vstack)
Text("Some Text")
.lineLimit(1)
.fixedSize()
将始终显示在完整显示的 1 行中。
我正在尝试在 VStack
中创建一个简单的 Text
堆栈,无论我做什么,文本都会截断而不是换行,即使我明确设置 lineLimit(nil)
(虽然我知道这是现在的默认值)。
我试过在 VStack 的第一个元素上设置 layoutPriority(1)
,我也试过按照其他一些帖子的建议设置 frame(idealHeight: .greatestFiniteMagnitude)
,但似乎没有什么可以解决这个问题。
以下是实际问题的视频:
下面是一些重现问题的代码:
import SwiftUI
struct BugRepro: View {
@State var length: Double = 1.0
var body: some View {
VStack {
ForEach(0..<3) { i in
BugReproElement(index: i)
}
.background(Color.gray3)
.frame(width: UIScreen.main.bounds.width * CGFloat(length))
Slider(value: $length, in: 0.0...1.0)
}
}
}
struct BugRepro_Previews: PreviewProvider {
static var previews: some View {
BugRepro()
}
}
struct BugReproElement: View {
var index: Int
var body: some View {
Text("iaush isuh siudh siudh isudh isudhdsiu sdiuh sdihs")
.foregroundColor(.gray7)
.frame(minWidth: 0, maxWidth: .infinity, alignment: .leading)
}
}
这可能只是 Xcode 中的错误吗?我是 运行 Beta 7
不幸的是这是一个错误。
您可以使用一种解决方法来强制它重新计算元素,但这只是一种解决方法,您必须等待发布并查看它是否已修复。
解决方法
在ForEach
.
struct BugRepro: View {
@State var length: Double = 1.0
var body: some View {
VStack {
ForEach(0..<3) { i in
Spacer().frame(height: 0)
BugReproElement(index: i)
Spacer().frame(height: 0)
}.frame(width: UIScreen.main.bounds.width * CGFloat(length))
Slider(value: self.$length, in: 0.0...1.0)
}
}
}
我想出了如何让文本正确呈现。
在此处应用答案有效:
关键是确保 .fixedSize()
在 .frame()
不需要Spacer()
!
.fixedSized
必须在 .font()
之前添加才能为我工作。
我必须添加 .fixedSize(horizontal: false, vertical: true)
AND .padding()
在我的所有文本停止截断(正确显示在视图中)之前我还有一个框架标签一个单独的 vstack(我在视图中有 2 个单独的 vstack)
Text("Some Text")
.lineLimit(1)
.fixedSize()
将始终显示在完整显示的 1 行中。