Wil*_*ers 3 swift swiftui swiftui-list
我正在使用列表来动态创建视图的多个实例,但是,当使用列表填充时,子视图的左侧和右侧添加了我无法删除它。我试过使用 .listRowInset,但这并没有产生明显的效果。
我创建了一个按需要工作的 PostView。我正在使用“PostsView”来动态生成多个 PostView 实例。
我试图让 PostView 中的图像触摸 PostsView 中的屏幕边缘。
后视图
import SwiftUI
struct PostView: View {
var post: Post
var body: some View {
VStack {
HStack {
Text(post.songInfo.album).font(.title)
Spacer()
Text(post.songInfo.artist)
}.padding()
Image(post.songInfo.albumArtUrl)
.resizable()
.aspectRatio(UIImage(named: "sweetner")!.size, contentMode: .fit)
HStack {
Image("plus-icon")
Spacer()
Image("comment-icon")
Spacer()
Image("headset-icon")
}.padding()
HStack {
Text(post.user.userName)
Spacer()
Text(post.textContent)
}.padding()
}
}
}
Run Code Online (Sandbox Code Playgroud)
帖子视图
import SwiftUI
struct PostsView: View {
@ObservedObject var fbVM = FirebaseInfo()
var body: some View {
List(fbVM.visiblePosts) { post in
PostView(post: post)
}
}
}
struct PostsView_Previews: PreviewProvider {
static var previews: some View {
PostsView()
}
}
Run Code Online (Sandbox Code Playgroud)

Doe*_*ata 13
更新
看看这个答案
看起来 .listRowInsets 不适用于用内容初始化的 List 中的行
因此,如果您稍微更改代码,就可以执行此操作。首先,您需要从帖子视图中删除填充,以便文本将移至边缘(如果这是您想要的):
struct PostView: View {
let placeholder = UIImage(named: "arianaGrande")!
var post: Post
var body: some View {
VStack {
HStack {
Text(post.album).font(.title)
Spacer()
Text(post.artist)
}// .padding() -- This padding adds space before "Sweetener and after Ariana Grande
Image(uiImage: placeholder)
.resizable()
.aspectRatio(placeholder.size, contentMode: .fit)
HStack {
Image("plus-icon")
Spacer()
Image("comment-icon")
Spacer()
Image("headset-icon")
}.padding()
HStack {
Text(post.username)
Spacer()
Text(post.textContent)
}//.padding() -- Same thing here.
}
}
}
struct PostView_Previews: PreviewProvider {
static var previews: some View {
PostView(post: Post(
artist: "Ariana Grande",
album: "Sweetener",
albumArtUrl: "",
username: "DoesData",
textContent: "Text Content"
)
)
}
}
Run Code Online (Sandbox Code Playgroud)
然后您可以稍微不同地初始化您的列表以删除间距。
struct PostsView: View {
var posts = [
Post(
artist: "Ariana Grande",
album: "Sweetener",
albumArtUrl: "",
username: "DoesData",
textContent: "Text Content"
)
]
var body: some View {
List {
ForEach(posts) { post in
PostView(post: post)
.listRowInsets(EdgeInsets())
}
}
}
}
struct Post: Identifiable {
let id = UUID()
let artist: String
let album: String
let albumArtUrl: String
let username: String
let textContent: String
}
struct PostsView_Previews: PreviewProvider {
static var previews: some View {
PostsView()
}
}
Run Code Online (Sandbox Code Playgroud)
结果:
原答案
看起来您可以调整列表本身的填充以删除前导和尾随边距。
import SwiftUI
struct PostsView: View {
@ObservedObject var fbVM = FirebaseInfo()
var body: some View {
List(fbVM.visiblePosts) { post in
PostView(post: post)
}.padding(.horizontal, -20) // -20 seems to make it go edge to edge
}
}
struct PostsView_Previews: PreviewProvider {
static var previews: some View {
PostsView()
}
}
Run Code Online (Sandbox Code Playgroud)
您可能还需要PostView像这样调整文本的
内边距Text("Title").font(.title).padding(.leading, -10)这看起来比它应该的更复杂,但它似乎有效。
使用.listRowInsets修改器内部的List建设者
var body: some View {
List {
Text("String")
.listRowInsets(EdgeInsets())
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,看起来 .listRowInsets 不适用于用内容初始化的 List 中的行。所以你需要在ForEach里面使用list:
var body: some View {
List {
ForEach(...) {
Text("String")
.listRowInsets(EdgeInsets())
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8143 次 |
| 最近记录: |