iOS 17中如何用scrollPosition(id:)获取ScrollView中项的索引
实现ScrollView滚动位置绑定数组索引(iOS 17+)
要让scrollPosition绑定数组的索引而非Item的ID,核心是让列表中每个视图的标识对应其在数组中的索引,具体实现如下:
1. 调整绑定变量类型
将原来的scrollPosition类型从Item.ID?改为Int?,用来存储索引值:
@Binding var items: [Item] @Binding var scrollPosition: Int? // 现在存储数组索引
2. 修改列表遍历逻辑
使用enumerated()获取数组的索引和元素,同时将索引作为每个列表项的唯一标识传递给ForEach:
ScrollView { LazyVStack { // 遍历数组的索引和元素,用offset(索引)作为ID ForEach(Array(items.enumerated()), id: \.offset) { index, item in ItemView(item) } } .scrollTargetLayout() } // 绑定scrollPosition到索引类型的ID .scrollPosition(id: $scrollPosition)
补充说明
- 滚动到第一个ItemView时,
scrollPosition会被设置为0;滚动到第二个则为1,以此类推。 - 如果数组元素发生增删,索引会自动对应最新的数组顺序,符合“当前数组位置索引”的需求。
内容的提问来源于stack exchange,提问作者Nicolas Gimelli
相关产品推荐
相关产品推荐

