You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI中如何消除两个Horizontal ScrollView之间的间距?

解决SwiftUI中两个水平ScrollView之间的间距问题

问题说明

尝试创建两个水平滚动的产品列表,已将外层VStack的spacing设为0,但两个ScrollView之间仍存在间距,需要消除该间隙。

解决方案

导致间距的核心原因是ScrollView默认带有内边距,以及LazyHGrid未显式设置间距,可通过以下步骤解决:

1. 移除ScrollView的默认内边距

针对iOS 16+版本,使用contentInsets直接将ScrollView的上下内边距设为0;iOS 15及以下版本,用padding(.vertical, 0)替代。

2. 显式设置LazyHGrid的间距为0

在HorizontalScrollModel的LazyHGrid初始化时,添加spacing: 0参数,避免网格自身的默认间距影响布局。

修改后的代码示例

主视图代码

var body: some View {
    NavigationView {
        VStack(spacing: 0) {
            Text("Zara")
                .font(.custom("AmericanTypewriter", fixedSize: 36))
            
            ScrollView(.horizontal) {
                HorizontalScrollModel(searchResult: searchResults1)
            }
            .contentInsets(.init(top: 0, leading: 0, bottom: 0, trailing: 0)) // iOS 16+
            .task {
                await loadData()
            }
            
            ScrollView(.horizontal) {
                HorizontalScrollModel(searchResult: searchResults1)
            }
            .contentInsets(.init(top: 0, leading: 0, bottom: 0, trailing: 0)) // iOS 16+
        }
    }
}

HorizontalScrollModel代码

struct HorizontalScrollModel: View {
    
    var searchResults1: [homeResult]
    let columns = [GridItem(.adaptive(minimum: 200))]
    @State private var isHearted = false

    init(searchResult: [homeResult]) {
        self.searchResults1 = searchResult
    }
    
    var body: some View {
        // 显式设置LazyHGrid的spacing为0
        LazyHGrid(rows: columns, spacing: 0) {
            ForEach(searchResults1, id: \.prodlink) { item in
                NavigationLink{
                    ProductView(imageLink: item.image_src, productLink: item.prodlink,
                                productCost: String(item.price))
                } label: {
                    VStack(alignment: .leading, spacing: 0) {
                        AsyncImage(url: URL(string: item.image_src)) { phase in
                            if let image = phase.image {
                                image
                                    .resizable()
                                    .scaledToFit()
                                    .frame(width: 150, height: 150)
                                    .clipShape(RoundedRectangle(cornerRadius: 10))
                            } else if phase.error != nil {
                                Text("加载图片出错")
                            } else {
                                ProgressView()
                            }
                        }
                        .padding()
                        .overlay(
                            RoundedRectangle(cornerRadius: 10)
                                .stroke(.gray.opacity(0.2), lineWidth: 4)
                        )
                        .padding(.top, 2)
                        .padding(.bottom, 2)
                        .padding(.leading, 2)
                        .padding(.trailing, 2)
                        .overlay(
                            RoundedRectangle(cornerRadius: 12)
                                .stroke(.gray.opacity(0.3), lineWidth: 1)
                        )
                    }
                }
            }
        }
    }
}

iOS 15及以下兼容写法

如果需要适配iOS 15,将contentInsets替换为padding(.vertical, 0):

ScrollView(.horizontal) {
    HorizontalScrollModel(searchResult: searchResults1)
}
.padding(.vertical, 0)

内容的提问来源于stack exchange,提问作者Shawn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 03:15:50