From 1fdabc6528a67a2e72c14d0922b4738dfe9a22e1 Mon Sep 17 00:00:00 2001 From: Ray <153027766+ramonclaudio@users.noreply.github.com> Date: Mon, 4 May 2026 21:03:11 -0400 Subject: [PATCH] [ios][ui] Add scrollPosition and id modifiers to ScrollView (#44652) --- .../UI/ScrollViewSharedPositionScreen.ios.tsx | 46 +++++++++++ .../src/screens/UI/UIScreen.ios.tsx | 8 ++ .../sdk/ui/swift-ui/scrollview.mdx | 54 +++++++++++++ .../expo-ui/swift-ui/modifiers.json | 2 +- packages/expo-ui/CHANGELOG.md | 1 + .../build/swift-ui/modifiers/index.d.ts | 6 +- .../build/swift-ui/modifiers/index.d.ts.map | 2 +- .../swift-ui/modifiers/scrollPosition.d.ts | 56 ++++++++++++++ .../modifiers/scrollPosition.d.ts.map | 1 + .../expo-ui/ios/Modifiers/IDModifier.swift | 12 +++ .../Modifiers/ScrollPositionModifier.swift | 52 +++++++++++++ .../ios/Modifiers/ViewModifierRegistry.swift | 8 ++ .../expo-ui/src/swift-ui/modifiers/index.ts | 6 +- .../src/swift-ui/modifiers/scrollPosition.ts | 76 +++++++++++++++++++ 14 files changed, 325 insertions(+), 5 deletions(-) create mode 100644 apps/native-component-list/src/screens/UI/ScrollViewSharedPositionScreen.ios.tsx create mode 100644 packages/expo-ui/build/swift-ui/modifiers/scrollPosition.d.ts create mode 100644 packages/expo-ui/build/swift-ui/modifiers/scrollPosition.d.ts.map create mode 100644 packages/expo-ui/ios/Modifiers/IDModifier.swift create mode 100644 packages/expo-ui/ios/Modifiers/ScrollPositionModifier.swift create mode 100644 packages/expo-ui/src/swift-ui/modifiers/scrollPosition.ts diff --git a/apps/native-component-list/src/screens/UI/ScrollViewSharedPositionScreen.ios.tsx b/apps/native-component-list/src/screens/UI/ScrollViewSharedPositionScreen.ios.tsx new file mode 100644 index 00000000000000..af0294398e8a29 --- /dev/null +++ b/apps/native-component-list/src/screens/UI/ScrollViewSharedPositionScreen.ios.tsx @@ -0,0 +1,46 @@ +import { Button, Host, ScrollView, Text, VStack, useNativeState } from '@expo/ui/swift-ui'; +import { id, padding, scrollPosition, scrollTargetLayout } from '@expo/ui/swift-ui/modifiers'; +import { scheduleOnUI } from 'react-native-worklets'; + +export default function ScrollViewSharedPositionScreen() { + const activeID = useNativeState(null); + + const scrollToID = (target: string) => { + scheduleOnUI(() => { + 'worklet'; + activeID.value = target; + }); + }; + + return ( + + + { + console.log('[JS thread] leading target:', newID); + }, + }), + ]}> + + {Array.from({ length: 40 }, (_, i) => ( + + {`Item ${i}`} + + ))} + + +