如何让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
相关产品推荐
相关产品推荐

