diff --git a/packages/react-native-ui-lib/src/components/tabController/TabBarItem.tsx b/packages/react-native-ui-lib/src/components/tabController/TabBarItem.tsx index ac6d7780c6..331c995238 100644 --- a/packages/react-native-ui-lib/src/components/tabController/TabBarItem.tsx +++ b/packages/react-native-ui-lib/src/components/tabController/TabBarItem.tsx @@ -224,6 +224,13 @@ export default function TabBarItem({ }) .onTouchesDown(() => { isPressed.value = true; + }) + // NOTE: On iOS a cancelled tap (i.e. when the enclosing ScrollView claims the touch) transitions the + // recognizer straight from POSSIBLE to CANCELLED, which emits no state change event, so onFinalize + // is never called and the press feedback stays on the item. + // Releasing it from the touch stream as well makes sure it is always cleared. + .onTouchesCancelled(() => { + isPressed.value = false; }); return (