swift - ForEach 视图 SwiftUI 之间的奇怪空间
问题描述
我有这样的代码:
ForEach(listItems, id: \.self){ item in
HStack{
Button(action: {
actionSheet()
}) {
HStack(spacing: 10) {
Image(item.img)
Text(item.title)
.modifier(TextHandler(fontSize: 16, rgbArray: [47,47,47]))
.padding(.leading,10)
}
}.padding(.all,20)
Spacer()
}
.background(Color(red: listItemBack, green: listItemBack, blue: listItemBack))
.padding(EdgeInsets(top: 0, leading: 16, bottom: 0, trailing: 16))
}
结果是:
为什么这个循环的视图有这个奇怪的空白。但是当我只将带有一些项目数据的文本放入这个循环时,这些空格就消失了。为什么会这样?也许我的填充物在某处重叠?我尝试使用此代码:
.listRowInsets(EdgeInsets())
但它根本没有帮助我。
解决方案
它是你的填充Button
物(.all,20)
。
ForEach(listItems, id: \.self){ item in
HStack{
Button(action: {
actionSheet()
}) {
HStack(spacing: 10) {
Image(item.img)
Text(item.title)
.modifier(TextHandler(fontSize: 16, rgbArray: [47,47,47]))
.padding(.leading,10)
}
}.padding(.all,20)
Spacer()
}
.background(Color(red: listItemBack, green: listItemBack, blue: listItemBack)). // This is causing the spacing. It needs to be moved to the parent view.
.padding(EdgeInsets(top: 0, leading: 16, bottom: 0, trailing: 16))
}
如果您希望它们在没有空白的纯色背景中隔开,则背景需要在父视图上进行。当我将您的代码放入 aVStack
并放入.background
时,VStack
我想出了这个:
这是你想要的?
编辑:您一直将填充Button
设置为 20。这将在创建的每个按钮周围留出空间。然后你把你.background
放在每个HStack
包含一个Button
. 是在.padding
按钮周围,但HStack
只是 的高度,而Button
不是Button
and .padding
。如果您注释掉.padding(.all,20)
,您将看到视图折叠,直到Buttons
它们彼此相邻。我相信你不希望那样。
通过将背景放在父视图上(在我的情况下,我将您的代码放入 aVStack
中,所以.background
就到了那里),您将一个背景放在所有按钮后面,而不是每个按钮一个背景有一个间隙。
第二次编辑:这是我最小的、可重现的示例代码。请注意,我无权访问您的listItemBack
变量来设置背景颜色,所以我只使用了灰色。
import SwiftUI
struct SpaceView: View {
@State var listItems: [ListItem] = [ListItem(title: "First", img: "internaldrive"),
ListItem(title: "Second", img: "paperplane"),
ListItem(title: "Third", img: "scribble"),
ListItem(title: "Fourth", img: "tram.fill"),
ListItem(title: "Fifth", img: "clock"),
ListItem(title: "Sixth", img: "a.magnify"),
ListItem(title: "Seventh", img: "arrowshape.zigzag.forward")
]
var body: some View {
VStack {
ForEach(listItems){ item in
HStack{
Button(action: {
print("\(item.title) Pressed")
}) {
HStack(spacing: 10) {
Image(systemName: item.img)
Text(item.title)
// .modifier(TextHandler(fontSize: 16, rgbArray: [47,47,47]))
.padding(.leading,10)
}
}.padding(.all,20)
Spacer()
}
// .background(Color(red: listItemBack, green: listItemBack, blue: listItemBack))
//.background(Color.gray) // Uncomment here and comment out the other background to see the difference.
.padding(EdgeInsets(top: 0, leading: 16, bottom: 0, trailing: 16))
}
}
.background(Color.gray) // Comment out here to switch between your view an my view.
}
}
struct ListItem: Identifiable, Hashable {
var id = UUID()
var title: String
var img: String
}
struct SpaceView_Previews: PreviewProvider {
static var previews: some View {
SpaceView()
}
}
推荐阅读
- java - 如何在 JPA 中使用 ZeroOrOneToOne 反向引用映射 OneToOne?
- javascript - 从 JavaScript 文件中导出函数
- reactjs - 在 useEffect 中访问 Formik 的 setValues
- python - 不断将渲染的 Matplotlib 训练指标图更新到我的显示器
- r - R中的Loc函数?
- awk - AWK 过滤然后修剪输出
- angular - 访问 Angular 中动态生成的材料表中的列
- azure - 如何使用 Powershell 从 Azure Functions 获取 Azure Blob Uri?
- reactjs - 从 auth0 收到令牌后如何在 react.js 中调用/检索 getTokenSilent
- linked-list - 这个函数fun的结果是什么?