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

如何让SwiftUI ScrollView仅对每隔一个内容项实现吸附?

解决ScrollView精确控制吸附目标的问题

核心实现代码

在iOS 17+(WWDC23推出的SwiftUI API对应的最低系统版本)中,scrollTarget(isEnabled:)修饰符确实存在,可直接为单个视图配置是否启用吸附。以下代码实现仅对奇数位置的Rectangle启用吸附:

struct ContentView: View {
    var body: some View {
        ScrollView {
            LazyVStack(spacing: 8) {
                ForEach(1..<100) { number in
                    Rectangle()
                        .fill(.mint)
                        .frame(height: 200)
                        // 根据需求自定义判断逻辑,此处仅奇数项启用吸附
                        .scrollTarget(isEnabled: number % 2 == 1)
                }
            }
            .scrollTargetLayout()
        }
        .scrollTargetBehavior(.viewAligned)
    }
}

关键逻辑说明

  • scrollTarget(isEnabled:):针对单个视图控制是否成为滚动吸附目标,传入true则该视图会在滚动结束后自动吸附对齐,false则跳过该视图的吸附逻辑
  • scrollTargetLayout():必须保留该修饰符,它负责将布局容器内的视图标记为潜在滚动目标,而scrollTarget(isEnabled:)则逐个覆盖全局的启用状态
  • scrollTargetBehavior(.viewAligned):维持原有的对齐行为,确保启用吸附的视图滚动完成后会对齐到ScrollView的可视边界

关于文档疑问的解答

你看到的文档描述准确无误:scrollTargetLayout(isEnabled:)是批量设置所有子视图的吸附状态,而scrollTarget(isEnabled:)是单个视图的精细控制选项。这个修饰符仅存在于iOS 17、iPadOS 17及以上版本的SwiftUI中,若你的项目部署目标低于该版本,IDE不会显示该修饰符的提示,这可能是你误以为它不存在的原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 15:22:29