SwiftUI中Grid动态宽度单元格换行问题求助
SwiftUI Grid 文本自动换行问题解决办法
你的问题出在外层的水平ScrollView导致Grid没有宽度约束,内部的长文本会无限横向延展,不会自动换行。下面是两种修改方案:
方案一:给单元格设置固定宽度
给每个GridRow里的内容容器设置固定宽度,同时让文本允许垂直换行:
ScrollView(.horizontal) { Grid { ForEach(0..<3) { _ in GridRow { VStack(alignment: .leading, spacing: 16) { VStack(alignment: .leading, spacing: 8) { Text("Lorem".uppercased()) .bold() .font(.footnote) Text("Lorem Lorem Lorem Lorem Lorem Lorem Lorem Lorem Lorem Lorem Lorem Lorem Lorem Lorem Lorem Lorem ") .font(.caption) // 关闭水平方向自适应,允许垂直换行 .fixedSize(horizontal: false, vertical: true) } } // 固定单元格宽度,可根据需求调整数值 .frame(width: 280) } .padding(16) .background(.secondary.opacity(0.1)) .clipShape(.buttonBorder) } } }
方案二:设置最大宽度(自适应场景)
如果不想用固定宽度,可以给内容容器设置最大宽度,文本会在最大宽度内自动换行:
ScrollView(.horizontal) { Grid { ForEach(0..<3) { _ in GridRow { VStack(alignment: .leading, spacing: 16) { VStack(alignment: .leading, spacing: 8) { Text("Lorem".uppercased()) .bold() .font(.footnote) Text("Lorem Lorem Lorem Lorem Lorem Lorem Lorem Lorem Lorem Lorem Lorem Lorem Lorem Lorem Lorem Lorem ") .font(.caption) .fixedSize(horizontal: false, vertical: true) } } // 设置单元格最大宽度,超过后文本自动换行 .frame(maxWidth: 300) } .padding(16) .background(.secondary.opacity(0.1)) .clipShape(.buttonBorder) } } }
核心要点:必须给Grid的单元格内容添加宽度约束(固定或最大宽度),同时给长文本加上.fixedSize(horizontal: false, vertical: true),强制文本在宽度限制内自动换行。
内容的提问来源于stack exchange,提问作者kAiN
相关产品推荐
相关产品推荐

