react-native-tvos 0.83.9-0 → 0.83.10-0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Libraries/ActionSheetIOS/React-RCTActionSheet.podspec +1 -1
- package/Libraries/Animated/components/AnimatedScrollView.js +1 -1
- package/Libraries/AppDelegate/React-RCTAppDelegate.podspec +1 -1
- package/Libraries/Blob/React-RCTBlob.podspec +1 -1
- package/Libraries/Components/Button.js +2 -2
- package/Libraries/Components/ScrollView/ScrollView.d.ts +1 -1
- package/Libraries/Components/ScrollView/ScrollView.js +1 -1
- package/Libraries/Components/TV/TVViewPropTypes.js +9 -0
- package/Libraries/Components/TextInput/AndroidTextInputNativeComponent.js +1 -1
- package/Libraries/Components/TextInput/TextInput.flow.js +1 -1
- package/Libraries/Components/Touchable/Touchable.d.ts +1 -1
- package/Libraries/Components/View/View.js +7 -3
- package/Libraries/Components/View/ViewAccessibility.d.ts +1 -1
- package/Libraries/Components/View/ViewAccessibility.js +1 -1
- package/Libraries/Core/ReactNativeVersion.js +1 -1
- package/Libraries/Core/Timers/JSTimers.js +1 -1
- package/Libraries/Core/setUpNavigator.js +1 -1
- package/Libraries/EventEmitter/RCTNativeAppEventEmitter.d.ts +1 -1
- package/Libraries/FBLazyVector/FBLazyVector.podspec +1 -1
- package/Libraries/Image/ImageSource.d.ts +1 -1
- package/Libraries/Image/RCTImageLoader.mm +1 -1
- package/Libraries/Image/React-RCTImage.podspec +1 -1
- package/Libraries/Interaction/PanResponder.js +1 -1
- package/Libraries/LinkingIOS/React-RCTLinking.podspec +1 -1
- package/Libraries/NativeAnimation/React-RCTAnimation.podspec +1 -1
- package/Libraries/NativeComponent/TVViewConfig.js +1 -0
- package/Libraries/Network/React-RCTNetwork.podspec +1 -1
- package/Libraries/PushNotificationIOS/React-RCTPushNotification.podspec +1 -1
- package/Libraries/Renderer/README.md +2 -2
- package/Libraries/Required/RCTRequired.podspec +1 -1
- package/Libraries/Settings/React-RCTSettings.podspec +1 -1
- package/Libraries/Text/React-RCTText.podspec +1 -1
- package/Libraries/TypeSafety/RCTTypeSafety.podspec +1 -1
- package/Libraries/Utilities/PolyfillFunctions.js +1 -1
- package/Libraries/Vibration/React-RCTVibration.podspec +1 -1
- package/README-core.md +6 -6
- package/README.md +13 -1
- package/React/Base/RCTVersion.m +1 -1
- package/React/CoreModules/React-CoreModules.podspec +1 -1
- package/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm +49 -17
- package/React/Fabric/Mounting/ComponentViews/TextInput/RCTTextInputComponentView.mm +12 -1
- package/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm +34 -5
- package/React/React-RCTFBReactNativeSpec.podspec +1 -1
- package/React/React-RCTFabric.podspec +1 -1
- package/React/Runtime/React-RCTRuntime.podspec +1 -1
- package/React/Tests/Mounting/RCTViewComponentViewTests.mm +145 -0
- package/React/Views/ScrollView/RCTScrollView.m +1 -1
- package/React-Core.podspec +1 -1
- package/React.podspec +1 -1
- package/ReactAndroid/build.gradle.kts +1 -1
- package/ReactAndroid/gradle.properties +1 -1
- package/ReactAndroid/hermes-engine/build.gradle.kts +6 -0
- package/ReactAndroid/publish.gradle +5 -5
- package/ReactAndroid/src/main/java/com/facebook/react/devsupport/CxxInspectorPackagerConnection.kt +99 -9
- package/ReactAndroid/src/main/java/com/facebook/react/devsupport/inspector/InspectorNetworkHelper.kt +1 -1
- package/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/SurfaceMountingManager.java +2 -2
- package/ReactAndroid/src/main/java/com/facebook/react/modules/core/JavaTimerManager.kt +1 -1
- package/ReactAndroid/src/main/java/com/facebook/react/modules/core/ReactAndroidHWInputDeviceHelper.java +1 -0
- package/ReactAndroid/src/main/java/com/facebook/react/modules/intent/IntentModule.kt +1 -1
- package/ReactAndroid/src/main/java/com/facebook/react/modules/network/NetworkingModule.kt +3 -3
- package/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.kt +1 -1
- package/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactInstance.kt +1 -1
- package/ReactAndroid/src/main/java/com/facebook/react/uimanager/BaseViewManager.java +1 -1
- package/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java +14 -4
- package/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java +14 -4
- package/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollViewHelper.kt +46 -6
- package/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollViewManager.kt +1 -1
- package/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextView.java +1 -1
- package/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.kt +2 -2
- package/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputManager.kt +2 -2
- package/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextSelectionWatcher.kt +1 -1
- package/ReactAndroid/src/main/java/com/facebook/react/views/view/ReactViewGroup.kt +1 -0
- package/ReactAndroid/src/main/java/com/facebook/react/views/view/ReactViewManager.kt +5 -0
- package/ReactAndroid/src/main/jni/react/devsupport/JCxxInspectorPackagerConnectionWebSocket.cpp +29 -2
- package/ReactApple/Libraries/RCTFoundation/RCTDeprecation/RCTDeprecation.podspec +1 -1
- package/ReactApple/RCTSwiftUI/RCTSwiftUI.podspec +1 -1
- package/ReactApple/RCTSwiftUIWrapper/RCTSwiftUIWrapper.podspec +1 -1
- package/ReactCommon/React-Fabric.podspec +1 -1
- package/ReactCommon/React-FabricComponents.podspec +1 -1
- package/ReactCommon/React-FabricImage.podspec +1 -1
- package/ReactCommon/React-Mapbuffer.podspec +1 -1
- package/ReactCommon/ReactCommon.podspec +1 -1
- package/ReactCommon/callinvoker/React-callinvoker.podspec +1 -1
- package/ReactCommon/cxxreact/React-cxxreact.podspec +1 -1
- package/ReactCommon/cxxreact/ReactNativeVersion.h +2 -2
- package/ReactCommon/hermes/React-hermes.podspec +1 -1
- package/ReactCommon/hermes/executor/React-jsitracing.podspec +1 -1
- package/ReactCommon/jserrorhandler/React-jserrorhandler.podspec +1 -1
- package/ReactCommon/jsi/React-jsi.podspec +1 -1
- package/ReactCommon/jsiexecutor/React-jsiexecutor.podspec +1 -1
- package/ReactCommon/jsinspector-modern/InspectorInterfaces.cpp +7 -3
- package/ReactCommon/jsinspector-modern/React-jsinspector.podspec +1 -1
- package/ReactCommon/jsinspector-modern/TracingAgent.cpp +1 -5
- package/ReactCommon/jsinspector-modern/cdp/React-jsinspectorcdp.podspec +1 -1
- package/ReactCommon/jsinspector-modern/network/React-jsinspectornetwork.podspec +1 -1
- package/ReactCommon/jsinspector-modern/tracing/React-jsinspectortracing.podspec +1 -1
- package/ReactCommon/jsitooling/React-jsitooling.podspec +1 -1
- package/ReactCommon/logger/React-logger.podspec +1 -1
- package/ReactCommon/oscompat/React-oscompat.podspec +1 -1
- package/ReactCommon/react/debug/React-debug.podspec +1 -1
- package/ReactCommon/react/debug/redbox/JscSafeUrl.h +1 -1
- package/ReactCommon/react/featureflags/React-featureflags.podspec +1 -1
- package/ReactCommon/react/nativemodule/core/platform/android/ReactCommon/JavaTurboModule.cpp +1 -1
- package/ReactCommon/react/nativemodule/core/platform/ios/React-NativeModulesApple.podspec +1 -1
- package/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTInteropTurboModule.mm +1 -1
- package/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModule.mm +1 -1
- package/ReactCommon/react/nativemodule/defaults/React-defaultsnativemodule.podspec +1 -1
- package/ReactCommon/react/nativemodule/dom/React-domnativemodule.podspec +1 -1
- package/ReactCommon/react/nativemodule/featureflags/React-featureflagsnativemodule.podspec +1 -1
- package/ReactCommon/react/nativemodule/idlecallbacks/React-idlecallbacksnativemodule.podspec +1 -1
- package/ReactCommon/react/nativemodule/intersectionobserver/React-intersectionobservernativemodule.podspec +1 -1
- package/ReactCommon/react/nativemodule/microtasks/React-microtasksnativemodule.podspec +1 -1
- package/ReactCommon/react/nativemodule/mutationobserver/React-mutationobservernativemodule.podspec +1 -1
- package/ReactCommon/react/nativemodule/samples/ReactCommon-Samples.podspec +1 -1
- package/ReactCommon/react/nativemodule/webperformance/React-webperformancenativemodule.podspec +1 -1
- package/ReactCommon/react/networking/React-networking.podspec +1 -1
- package/ReactCommon/react/performance/cdpmetrics/React-performancecdpmetrics.podspec +1 -1
- package/ReactCommon/react/performance/timeline/React-performancetimeline.podspec +1 -1
- package/ReactCommon/react/renderer/animated/internal/primitives.h +1 -1
- package/ReactCommon/react/renderer/components/view/BaseViewProps.cpp +7 -0
- package/ReactCommon/react/renderer/components/view/BaseViewProps.h +1 -0
- package/ReactCommon/react/renderer/components/view/platform/android/react/renderer/components/view/HostPlatformViewProps.cpp +18 -0
- package/ReactCommon/react/renderer/components/view/platform/android/react/renderer/components/view/HostPlatformViewProps.h +1 -0
- package/ReactCommon/react/renderer/consistency/React-rendererconsistency.podspec +1 -1
- package/ReactCommon/react/renderer/css/React-renderercss.podspec +1 -1
- package/ReactCommon/react/renderer/debug/React-rendererdebug.podspec +1 -1
- package/ReactCommon/react/renderer/graphics/React-graphics.podspec +1 -1
- package/ReactCommon/react/renderer/imagemanager/platform/ios/React-ImageManager.podspec +1 -1
- package/ReactCommon/react/renderer/mounting/internal/CullingContext.cpp +1 -1
- package/ReactCommon/react/renderer/runtimescheduler/React-runtimescheduler.podspec +1 -1
- package/ReactCommon/react/runtime/React-RuntimeCore.podspec +1 -1
- package/ReactCommon/react/runtime/React-RuntimeHermes.podspec +1 -1
- package/ReactCommon/react/runtime/platform/ios/React-RuntimeApple.podspec +1 -1
- package/ReactCommon/react/timing/React-timing.podspec +1 -1
- package/ReactCommon/react/utils/React-utils.podspec +1 -1
- package/ReactCommon/reactperflogger/React-perflogger.podspec +1 -1
- package/ReactCommon/runtimeexecutor/React-runtimeexecutor.podspec +1 -1
- package/ReactCommon/yoga/Yoga.podspec +2 -2
- package/ReactCommon/yoga/yoga/algorithm/AbsoluteLayout.cpp +2 -0
- package/ReactCommon/yoga/yoga/algorithm/CalculateLayout.cpp +11 -7
- package/ReactCommon/yoga/yoga/algorithm/CalculateLayout.h +2 -0
- package/ReactCommon/yoga/yoga/node/Node.cpp +6 -1
- package/package.json +9 -9
- package/scripts/cocoapods/rncore.rb +26 -8
- package/scripts/cocoapods/rndependencies.rb +26 -5
- package/scripts/cocoapods/spm.rb +1 -1
- package/scripts/cocoapods/utils.rb +2 -2
- package/scripts/codegen/templates/ReactAppDependencyProvider.podspec.template +1 -1
- package/scripts/codegen/templates/ReactCodegen.podspec.template +1 -1
- package/scripts/ios-configure-glog.sh +1 -1
- package/sdks/hermes-engine/hermes-engine.podspec +6 -1
- package/sdks/hermes-engine/hermes-utils.rb +27 -5
- package/src/private/types/HostInstance.js +1 -1
- package/src/types/globals.d.ts +2 -2
- package/third-party-podspecs/RCT-Folly.podspec +1 -1
- package/third-party-podspecs/ReactNativeDependencies.podspec +1 -1
- package/third-party-podspecs/glog.podspec +1 -1
- package/types/public/ReactNativeTVTypes.d.ts +9 -0
- package/types/public/ReactNativeTypes.d.ts +2 -2
|
@@ -8,7 +8,7 @@ require "json"
|
|
|
8
8
|
package = JSON.parse(File.read(File.join(__dir__, "..", "..", "package.json")))
|
|
9
9
|
version = package['version']
|
|
10
10
|
|
|
11
|
-
source = { :git => 'https://github.com/
|
|
11
|
+
source = { :git => 'https://github.com/react/react-native.git' }
|
|
12
12
|
if version == '1000.0.0'
|
|
13
13
|
# This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in.
|
|
14
14
|
source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1")
|
|
@@ -31,7 +31,7 @@ import {cloneElement, useMemo} from 'react';
|
|
|
31
31
|
type AnimatedScrollViewInstance = React.ElementRef<typeof ScrollView>;
|
|
32
32
|
|
|
33
33
|
/**
|
|
34
|
-
* @see https://github.com/
|
|
34
|
+
* @see https://github.com/react/react-native/commit/b8c8562
|
|
35
35
|
*/
|
|
36
36
|
const AnimatedScrollView: AnimatedComponentType<
|
|
37
37
|
ScrollViewProps,
|
|
@@ -8,7 +8,7 @@ require "json"
|
|
|
8
8
|
package = JSON.parse(File.read(File.join(__dir__, "..", "..", "package.json")))
|
|
9
9
|
version = package['version']
|
|
10
10
|
|
|
11
|
-
source = { :git => 'https://github.com/
|
|
11
|
+
source = { :git => 'https://github.com/react/react-native.git' }
|
|
12
12
|
if version == '1000.0.0'
|
|
13
13
|
# This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in.
|
|
14
14
|
source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1")
|
|
@@ -8,7 +8,7 @@ require "json"
|
|
|
8
8
|
package = JSON.parse(File.read(File.join(__dir__, "..", "..", "package.json")))
|
|
9
9
|
version = package['version']
|
|
10
10
|
|
|
11
|
-
source = { :git => 'https://github.com/
|
|
11
|
+
source = { :git => 'https://github.com/react/react-native.git' }
|
|
12
12
|
if version == '1000.0.0'
|
|
13
13
|
# This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in.
|
|
14
14
|
source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1")
|
|
@@ -127,7 +127,7 @@ export type ButtonProps = $ReadOnly<{
|
|
|
127
127
|
accessibilityLabel?: ?string,
|
|
128
128
|
/**
|
|
129
129
|
* Alias for accessibilityLabel https://reactnative.dev/docs/view#accessibilitylabel
|
|
130
|
-
* https://github.com/
|
|
130
|
+
* https://github.com/react/react-native/issues/34424
|
|
131
131
|
*/
|
|
132
132
|
'aria-label'?: ?string,
|
|
133
133
|
/**
|
|
@@ -181,7 +181,7 @@ export type ButtonProps = $ReadOnly<{
|
|
|
181
181
|
[button:examples].
|
|
182
182
|
|
|
183
183
|
[button:source]:
|
|
184
|
-
https://github.com/
|
|
184
|
+
https://github.com/react/react-native/blob/HEAD/Libraries/Components/Button.js
|
|
185
185
|
|
|
186
186
|
[button:examples]:
|
|
187
187
|
https://js.coach/?menu%5Bcollections%5D=React%20Native&page=1&query=button
|
|
@@ -515,7 +515,7 @@ export interface ScrollViewPropsIOS {
|
|
|
515
515
|
* - `start` (the default) will align the snap at the left (horizontal) or top (vertical)
|
|
516
516
|
* - `center` will align the snap in the center
|
|
517
517
|
* - `end` will align the snap at the right (horizontal) or bottom (vertical)
|
|
518
|
-
* - `item` will align the snap according to
|
|
518
|
+
* - `item` will align the snap according to each item's own `scrollSnapAlign` or `scrollSnapOffset` prop (TV platforms only).
|
|
519
519
|
*/
|
|
520
520
|
snapToAlignment?: 'start' | 'center' | 'end' | 'item' | undefined;
|
|
521
521
|
|
|
@@ -612,7 +612,7 @@ type ScrollViewBaseProps = $ReadOnly<{
|
|
|
612
612
|
* - `'start'` (the default) will align the snap at the left (horizontal) or top (vertical)
|
|
613
613
|
* - `'center'` will align the snap in the center
|
|
614
614
|
* - `'end'` will align the snap at the right (horizontal) or bottom (vertical)
|
|
615
|
-
* - `'item'` will align the snap according to
|
|
615
|
+
* - `'item'` will align the snap according to each item's own `scrollSnapAlign` or `scrollSnapOffset` prop (TV platforms only).
|
|
616
616
|
*/
|
|
617
617
|
snapToAlignment?: ?('start' | 'center' | 'end' | 'item'),
|
|
618
618
|
/**
|
|
@@ -131,4 +131,13 @@ export type TVViewProps = $ReadOnly<{|
|
|
|
131
131
|
*/
|
|
132
132
|
scrollSnapAlign?: ?('start' | 'center' | 'end'),
|
|
133
133
|
|
|
134
|
+
/**
|
|
135
|
+
* Per-item scroll snap offset in dp/pt. When set on a View inside a
|
|
136
|
+
* ScrollView with `snapToAlignment="item"`, the focus engine lands the
|
|
137
|
+
* View's top at viewport y = scrollSnapOffset. Standalone alternative to
|
|
138
|
+
* `scrollSnapAlign` — set one or the other; if both are set on the same
|
|
139
|
+
* View, `scrollSnapOffset` takes precedence.
|
|
140
|
+
*/
|
|
141
|
+
scrollSnapOffset?: ?number,
|
|
142
|
+
|
|
134
143
|
|}>;
|
|
@@ -553,7 +553,7 @@ export type AndroidTextInputNativeProps = $ReadOnly<{
|
|
|
553
553
|
* - `borderBottomRightRadius`
|
|
554
554
|
* - `borderBottomLeftRadius`
|
|
555
555
|
*
|
|
556
|
-
* see [Issue#7070](https://github.com/
|
|
556
|
+
* see [Issue#7070](https://github.com/react/react-native/issues/7070)
|
|
557
557
|
* for more detail.
|
|
558
558
|
*
|
|
559
559
|
* [Styles](docs/style.html)
|
|
@@ -1007,7 +1007,7 @@ type TextInputBaseProps = $ReadOnly<{
|
|
|
1007
1007
|
* - `borderBottomRightRadius`
|
|
1008
1008
|
* - `borderBottomLeftRadius`
|
|
1009
1009
|
*
|
|
1010
|
-
* see [Issue#7070](https://github.com/
|
|
1010
|
+
* see [Issue#7070](https://github.com/react/react-native/issues/7070)
|
|
1011
1011
|
* for more detail.
|
|
1012
1012
|
*
|
|
1013
1013
|
* [Styles](docs/style.html)
|
|
@@ -32,7 +32,7 @@ export const Touchable: {
|
|
|
32
32
|
};
|
|
33
33
|
|
|
34
34
|
/**
|
|
35
|
-
* @see https://github.com/
|
|
35
|
+
* @see https://github.com/react/react-native/blob/0.34-stable\Libraries\Components\Touchable\Touchable.js
|
|
36
36
|
*/
|
|
37
37
|
interface TouchableMixin {
|
|
38
38
|
/**
|
|
@@ -153,9 +153,13 @@ component View(
|
|
|
153
153
|
delete processedProps.isTVSelectable;
|
|
154
154
|
}
|
|
155
155
|
|
|
156
|
-
// Views with scrollSnapAlign must not be flattened by
|
|
157
|
-
// the prop never reaches the native view and scroll
|
|
158
|
-
|
|
156
|
+
// Views with scrollSnapAlign or scrollSnapOffset must not be flattened by
|
|
157
|
+
// Fabric, otherwise the prop never reaches the native view and scroll
|
|
158
|
+
// snapping breaks.
|
|
159
|
+
if (
|
|
160
|
+
processedProps.scrollSnapAlign != null ||
|
|
161
|
+
processedProps.scrollSnapOffset != null
|
|
162
|
+
) {
|
|
159
163
|
processedProps.collapsable = false;
|
|
160
164
|
}
|
|
161
165
|
|
|
@@ -34,7 +34,7 @@ export interface AccessibilityProps
|
|
|
34
34
|
|
|
35
35
|
/**
|
|
36
36
|
* Alias for accessibilityLabel https://reactnative.dev/docs/view#accessibilitylabel
|
|
37
|
-
* https://github.com/
|
|
37
|
+
* https://github.com/react/react-native/issues/34424
|
|
38
38
|
*/
|
|
39
39
|
'aria-label'?: string | undefined;
|
|
40
40
|
|
|
@@ -370,7 +370,7 @@ export type AccessibilityProps = $ReadOnly<{
|
|
|
370
370
|
|
|
371
371
|
/**
|
|
372
372
|
* Alias for accessibilityLabel https://reactnative.dev/docs/view#accessibilitylabel
|
|
373
|
-
* https://github.com/
|
|
373
|
+
* https://github.com/react/react-native/issues/34424
|
|
374
374
|
*/
|
|
375
375
|
'aria-label'?: ?Stringish,
|
|
376
376
|
|
|
@@ -158,7 +158,7 @@ function _callReactNativeMicrotasksPass() {
|
|
|
158
158
|
reactNativeMicrotasks = [];
|
|
159
159
|
|
|
160
160
|
// Use for loop rather than forEach as per @vjeux's advice
|
|
161
|
-
// https://github.com/
|
|
161
|
+
// https://github.com/react/react-native/commit/c8fd9f7588ad02d2293cac7224715f4af7b0f352#commitcomment-14570051
|
|
162
162
|
for (let i = 0; i < passReactNativeMicrotasks.length; ++i) {
|
|
163
163
|
_callTimer(passReactNativeMicrotasks[i], 0);
|
|
164
164
|
}
|
|
@@ -17,6 +17,6 @@ if (navigator === undefined) {
|
|
|
17
17
|
// $FlowExpectedError[cannot-write] The global isn't writable anywhere but here, where we define it.
|
|
18
18
|
global.navigator = {product: 'ReactNative'};
|
|
19
19
|
} else {
|
|
20
|
-
// see https://github.com/
|
|
20
|
+
// see https://github.com/react/react-native/issues/10881
|
|
21
21
|
polyfillObjectProperty(navigator, 'product', () => 'ReactNative');
|
|
22
22
|
}
|
|
@@ -20,7 +20,7 @@ export interface NativeEventSubscription {
|
|
|
20
20
|
* Receive events from native-code
|
|
21
21
|
* Deprecated - subclass NativeEventEmitter to create granular event modules instead of
|
|
22
22
|
* adding all event listeners directly to RCTNativeAppEventEmitter.
|
|
23
|
-
* @see https://github.com/
|
|
23
|
+
* @see https://github.com/react/react-native/blob/0.34-stable\Libraries\EventEmitter\RCTNativeAppEventEmitter.js
|
|
24
24
|
* @see https://reactnative.dev/docs/native-modules-ios#sending-events-to-javascript
|
|
25
25
|
*/
|
|
26
26
|
type RCTNativeAppEventEmitter = DeviceEventEmitterStatic;
|
|
@@ -8,7 +8,7 @@ require "json"
|
|
|
8
8
|
package = JSON.parse(File.read(File.join(__dir__, "..", "..", "package.json")))
|
|
9
9
|
version = package['version']
|
|
10
10
|
|
|
11
|
-
source = { :git => 'https://github.com/
|
|
11
|
+
source = { :git => 'https://github.com/react/react-native.git' }
|
|
12
12
|
if version == '1000.0.0'
|
|
13
13
|
# This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in.
|
|
14
14
|
source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1")
|
|
@@ -517,7 +517,7 @@ static RCTImageLoaderCancellationBlock RCTLoadImageURLFromLoader(
|
|
|
517
517
|
// Add missing png extension
|
|
518
518
|
if (request.URL.fileURL && request.URL.pathExtension.length == 0) {
|
|
519
519
|
// Check if there exists a file with that url on disk already
|
|
520
|
-
// This should fix issue https://github.com/
|
|
520
|
+
// This should fix issue https://github.com/react/react-native/issues/46870
|
|
521
521
|
if ([[NSFileManager defaultManager] fileExistsAtPath:request.URL.path]) {
|
|
522
522
|
mutableRequest.URL = request.URL;
|
|
523
523
|
} else {
|
|
@@ -8,7 +8,7 @@ require "json"
|
|
|
8
8
|
package = JSON.parse(File.read(File.join(__dir__, "..", "..", "package.json")))
|
|
9
9
|
version = package['version']
|
|
10
10
|
|
|
11
|
-
source = { :git => 'https://github.com/
|
|
11
|
+
source = { :git => 'https://github.com/react/react-native.git' }
|
|
12
12
|
if version == '1000.0.0'
|
|
13
13
|
# This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in.
|
|
14
14
|
source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1")
|
|
@@ -117,7 +117,7 @@ const currentCentroidY = TouchHistoryMath.currentCentroidY;
|
|
|
117
117
|
* ### Working Example
|
|
118
118
|
*
|
|
119
119
|
* To see it in action, try the
|
|
120
|
-
* [PanResponder example in RNTester](https://github.com/
|
|
120
|
+
* [PanResponder example in RNTester](https://github.com/react/react-native/blob/HEAD/packages/rn-tester/js/examples/PanResponder/PanResponderExample.js)
|
|
121
121
|
*/
|
|
122
122
|
|
|
123
123
|
export type PanResponderGestureState = {
|
|
@@ -8,7 +8,7 @@ require "json"
|
|
|
8
8
|
package = JSON.parse(File.read(File.join(__dir__, "..", "..", "package.json")))
|
|
9
9
|
version = package['version']
|
|
10
10
|
|
|
11
|
-
source = { :git => 'https://github.com/
|
|
11
|
+
source = { :git => 'https://github.com/react/react-native.git' }
|
|
12
12
|
if version == '1000.0.0'
|
|
13
13
|
# This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in.
|
|
14
14
|
source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1")
|
|
@@ -8,7 +8,7 @@ require "json"
|
|
|
8
8
|
package = JSON.parse(File.read(File.join(__dir__, "..", "..", "package.json")))
|
|
9
9
|
version = package['version']
|
|
10
10
|
|
|
11
|
-
source = { :git => 'https://github.com/
|
|
11
|
+
source = { :git => 'https://github.com/react/react-native.git' }
|
|
12
12
|
if version == '1000.0.0'
|
|
13
13
|
# This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in.
|
|
14
14
|
source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1")
|
|
@@ -8,7 +8,7 @@ require "json"
|
|
|
8
8
|
package = JSON.parse(File.read(File.join(__dir__, "..", "..", "package.json")))
|
|
9
9
|
version = package['version']
|
|
10
10
|
|
|
11
|
-
source = { :git => 'https://github.com/
|
|
11
|
+
source = { :git => 'https://github.com/react/react-native.git' }
|
|
12
12
|
if version == '1000.0.0'
|
|
13
13
|
# This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in.
|
|
14
14
|
source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1")
|
|
@@ -8,7 +8,7 @@ require "json"
|
|
|
8
8
|
package = JSON.parse(File.read(File.join(__dir__, "..", "..", "package.json")))
|
|
9
9
|
version = package['version']
|
|
10
10
|
|
|
11
|
-
source = { :git => 'https://github.com/
|
|
11
|
+
source = { :git => 'https://github.com/react/react-native.git' }
|
|
12
12
|
if version == '1000.0.0'
|
|
13
13
|
# This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in.
|
|
14
14
|
source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1")
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
This page describes how React and React Native versions interact each other.
|
|
4
4
|
The version alignment between the two frameworks relies on two synchronization points:
|
|
5
5
|
|
|
6
|
-
1. The versions in the `package.json` of the new app template. For example [for React Native 0.68.1](https://github.com/
|
|
6
|
+
1. The versions in the `package.json` of the new app template. For example [for React Native 0.68.1](https://github.com/react/react-native/blob/0.68-stable/template/package.json#L12-L15) the versions are aligned as follows:
|
|
7
7
|
|
|
8
8
|
```
|
|
9
9
|
"dependencies": {
|
|
@@ -12,7 +12,7 @@ The version alignment between the two frameworks relies on two synchronization p
|
|
|
12
12
|
},
|
|
13
13
|
```
|
|
14
14
|
|
|
15
|
-
1. The React renderers **shipped** with React Native inside this folder, the [./Libraries/Renderer](https://github.com/
|
|
15
|
+
1. The React renderers **shipped** with React Native inside this folder, the [./Libraries/Renderer](https://github.com/react/react-native/tree/main/Libraries/Renderer) folder, of React Native.
|
|
16
16
|
|
|
17
17
|
This practically means that you **can't bump** the version of React in your `package.json` to a later version,
|
|
18
18
|
as you will still be using the older renderer from the folder mentioned above. Bumping the react version in your `package.json` will lead to unexpected behaviors.
|
|
@@ -8,7 +8,7 @@ require "json"
|
|
|
8
8
|
package = JSON.parse(File.read(File.join(__dir__, "..", "..", "package.json")))
|
|
9
9
|
version = package['version']
|
|
10
10
|
|
|
11
|
-
source = { :git => 'https://github.com/
|
|
11
|
+
source = { :git => 'https://github.com/react/react-native.git' }
|
|
12
12
|
if version == '1000.0.0'
|
|
13
13
|
# This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in.
|
|
14
14
|
source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1")
|
|
@@ -8,7 +8,7 @@ require "json"
|
|
|
8
8
|
package = JSON.parse(File.read(File.join(__dir__, "..", "..", "package.json")))
|
|
9
9
|
version = package['version']
|
|
10
10
|
|
|
11
|
-
source = { :git => 'https://github.com/
|
|
11
|
+
source = { :git => 'https://github.com/react/react-native.git' }
|
|
12
12
|
if version == '1000.0.0'
|
|
13
13
|
# This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in.
|
|
14
14
|
source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1")
|
|
@@ -8,7 +8,7 @@ require "json"
|
|
|
8
8
|
package = JSON.parse(File.read(File.join(__dir__, "..", "..", "package.json")))
|
|
9
9
|
version = package['version']
|
|
10
10
|
|
|
11
|
-
source = { :git => 'https://github.com/
|
|
11
|
+
source = { :git => 'https://github.com/react/react-native.git' }
|
|
12
12
|
if version == '1000.0.0'
|
|
13
13
|
# This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in.
|
|
14
14
|
source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1")
|
|
@@ -8,7 +8,7 @@ require "json"
|
|
|
8
8
|
package = JSON.parse(File.read(File.join(__dir__, "..", "..", "package.json")))
|
|
9
9
|
version = package['version']
|
|
10
10
|
|
|
11
|
-
source = { :git => 'https://github.com/
|
|
11
|
+
source = { :git => 'https://github.com/react/react-native.git' }
|
|
12
12
|
if version == '1000.0.0'
|
|
13
13
|
# This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in.
|
|
14
14
|
source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1")
|
|
@@ -23,7 +23,7 @@ const defineLazyObjectProperty = require('./defineLazyObjectProperty').default;
|
|
|
23
23
|
*
|
|
24
24
|
* global.XMLHttpRequest = global.originalXMLHttpRequest;
|
|
25
25
|
*
|
|
26
|
-
* @see https://github.com/
|
|
26
|
+
* @see https://github.com/react/react-native/issues/934
|
|
27
27
|
*/
|
|
28
28
|
export function polyfillObjectProperty<T>(
|
|
29
29
|
object: {...},
|
|
@@ -8,7 +8,7 @@ require "json"
|
|
|
8
8
|
package = JSON.parse(File.read(File.join(__dir__, "..", "..", "package.json")))
|
|
9
9
|
version = package['version']
|
|
10
10
|
|
|
11
|
-
source = { :git => 'https://github.com/
|
|
11
|
+
source = { :git => 'https://github.com/react/react-native.git' }
|
|
12
12
|
if version == '1000.0.0'
|
|
13
13
|
# This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in.
|
|
14
14
|
source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1")
|
package/README-core.md
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
</p>
|
|
11
11
|
|
|
12
12
|
<p align="center">
|
|
13
|
-
<a href="https://github.com/
|
|
13
|
+
<a href="https://github.com/react/react-native/blob/HEAD/LICENSE">
|
|
14
14
|
<img src="https://img.shields.io/badge/license-MIT-blue.svg" alt="React Native is released under the MIT license." />
|
|
15
15
|
</a>
|
|
16
16
|
<a href="https://www.npmjs.org/package/react-native">
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
<span> · </span>
|
|
39
39
|
<a href="https://reactnative.dev/help">Community</a>
|
|
40
40
|
<span> · </span>
|
|
41
|
-
<a href="https://github.com/
|
|
41
|
+
<a href="https://github.com/react/react-native/blob/HEAD/.github/SUPPORT.md">Support</a>
|
|
42
42
|
</h3>
|
|
43
43
|
|
|
44
44
|
React Native brings [**React**'s][r] declarative UI framework to iOS and Android. With React Native, you use native UI controls and have full access to the native platform.
|
|
@@ -52,7 +52,7 @@ React Native is developed and supported by many companies and individual core co
|
|
|
52
52
|
|
|
53
53
|
[r]: https://react.dev/
|
|
54
54
|
[p]: https://reactnative.dev/docs/out-of-tree-platforms
|
|
55
|
-
[e]: https://github.com/
|
|
55
|
+
[e]: https://github.com/react/react-native/blob/HEAD/ECOSYSTEM.md
|
|
56
56
|
|
|
57
57
|
## Contents
|
|
58
58
|
|
|
@@ -123,13 +123,13 @@ Read our [**Contributing Guide**][contribute] to learn about our development pro
|
|
|
123
123
|
|
|
124
124
|
You can learn more about our vision for React Native in the [**Roadmap**][roadmap].
|
|
125
125
|
|
|
126
|
-
[roadmap]: https://github.com/
|
|
126
|
+
[roadmap]: https://github.com/react/react-native/wiki/Roadmap
|
|
127
127
|
|
|
128
128
|
### Good First Issues
|
|
129
129
|
|
|
130
130
|
We have a list of [good first issues][gfi] that contain bugs which have a relatively limited scope. This is a great place to get started, gain experience, and get familiar with our contribution process.
|
|
131
131
|
|
|
132
|
-
[gfi]: https://github.com/
|
|
132
|
+
[gfi]: https://github.com/react/react-native/labels/good%20first%20issue
|
|
133
133
|
|
|
134
134
|
### Discussions
|
|
135
135
|
|
|
@@ -141,4 +141,4 @@ Larger discussions and proposals are discussed in [**@react-native-community/dis
|
|
|
141
141
|
|
|
142
142
|
React Native is MIT licensed, as found in the [LICENSE][l] file.
|
|
143
143
|
|
|
144
|
-
[l]: https://github.com/
|
|
144
|
+
[l]: https://github.com/react/react-native/blob/main/LICENSE
|
package/README.md
CHANGED
|
@@ -272,6 +272,7 @@ class Game2048 extends React.Component {
|
|
|
272
272
|
| Prop (View) | Value | Description |
|
|
273
273
|
|---|---|---|
|
|
274
274
|
| scrollSnapAlign | `'start'` \| `'center'` \| `'end'` | Controls where this item snaps inside its parent ScrollView. Only used when the parent has `snapToAlignment="item"`. |
|
|
275
|
+
| scrollSnapOffset | `number` | Per-item pixel offset (in dp/pt). When set, the focus engine lands this item's leading edge at `scrollSnapOffset` from the viewport origin. Standalone alternative to `scrollSnapAlign` — takes precedence if both are set on the same item. Only used when the parent has `snapToAlignment="item"`. |
|
|
275
276
|
|
|
276
277
|
```jsx
|
|
277
278
|
<ScrollView
|
|
@@ -291,6 +292,16 @@ class Game2048 extends React.Component {
|
|
|
291
292
|
</ScrollView>
|
|
292
293
|
```
|
|
293
294
|
|
|
295
|
+
`scrollSnapOffset` is useful when different items in the same ScrollView need to land at different positions — e.g. a hero row peeking 27dp from the top while poster rows peek 550dp:
|
|
296
|
+
|
|
297
|
+
```jsx
|
|
298
|
+
<ScrollView snapToAlignment="item">
|
|
299
|
+
<View scrollSnapOffset={27}><Hero /></View>
|
|
300
|
+
<View scrollSnapOffset={100}><Featured /></View>
|
|
301
|
+
<View scrollSnapOffset={550}><PosterRow /></View>
|
|
302
|
+
</ScrollView>
|
|
303
|
+
```
|
|
304
|
+
|
|
294
305
|
- _ScrollView animation control_: The `scrollAnimationEnabled` prop allows disabling scroll animations when focus changes on TV. When set to `false`, the scroll view jumps instantly to the focused item instead of animating. This only affects TV platforms and has no effect on mobile.
|
|
295
306
|
|
|
296
307
|
| Prop (ScrollView) | Value | Description |
|
|
@@ -307,7 +318,8 @@ class Game2048 extends React.Component {
|
|
|
307
318
|
|
|
308
319
|
- _Interaction with existing ScrollView props_: The TV scroll props build on top of existing React Native ScrollView behavior. Here is how they interact:
|
|
309
320
|
|
|
310
|
-
- `snapToAlignment="item"` does not require `snapToInterval` to be set. It works as a standalone snapping mode where each child's `scrollSnapAlign` determines the snap position. If `snapToInterval` is also set, the interval is applied as an additional constraint after the item offset is computed.
|
|
321
|
+
- `snapToAlignment="item"` does not require `snapToInterval` to be set. It works as a standalone snapping mode where each child's `scrollSnapAlign` or `scrollSnapOffset` determines the snap position. If `snapToInterval` is also set, the interval is applied as an additional constraint after the item offset is computed.
|
|
322
|
+
- `scrollSnapOffset` ignores `snapToItemPadding`. The padding is a global value applied to `scrollSnapAlign` cases; `scrollSnapOffset` is itself a per-item pixel offset that fully specifies where the item lands.
|
|
311
323
|
- `snapToAlignment="item"` should not be combined with `pagingEnabled`. Both attempt to control scroll positioning independently, which leads to unpredictable behavior. Use one or the other.
|
|
312
324
|
- `snapToStart` and `snapToEnd` work independently of `snapToAlignment="item"`. They control edge behavior during swipe/drag momentum (whether the scroll view snaps to the first or last position), but do not affect focus driven item snapping.
|
|
313
325
|
- `scrollAnimationEnabled={false}` disables all scroll animations, including programmatic `scrollTo({animated: true})` calls. When disabled, all scrolling is instant.
|
package/React/Base/RCTVersion.m
CHANGED
|
@@ -8,7 +8,7 @@ require "json"
|
|
|
8
8
|
package = JSON.parse(File.read(File.join(__dir__, "..", "..", "package.json")))
|
|
9
9
|
version = package['version']
|
|
10
10
|
|
|
11
|
-
source = { :git => 'https://github.com/
|
|
11
|
+
source = { :git => 'https://github.com/react/react-native.git' }
|
|
12
12
|
if version == '1000.0.0'
|
|
13
13
|
# This is an unpublished version, use the latest commit hash of the react-native repo, which we’re presumably in.
|
|
14
14
|
source[:commit] = `git rev-parse HEAD`.strip if system("git rev-parse --git-dir > /dev/null 2>&1")
|
|
@@ -264,7 +264,7 @@ RCTSendScrollEventForNativeAnimations_DEPRECATED(UIScrollView *scrollView, NSInt
|
|
|
264
264
|
if (@available(iOS 14.0, *)) {
|
|
265
265
|
// On iOS when Prefer Cross-Fade Transitions is enabled, the keyboard position
|
|
266
266
|
// & height is reported differently (0 instead of Y position value matching height of frame)
|
|
267
|
-
// Fixes similar issue we saw with https://github.com/
|
|
267
|
+
// Fixes similar issue we saw with https://github.com/react/react-native/pull/34503
|
|
268
268
|
if (UIAccessibilityPrefersCrossFadeTransitions() && keyboardEndFrame.size.height == 0) {
|
|
269
269
|
newContentOffset.y = 0;
|
|
270
270
|
newEdgeInsets.bottom = 0;
|
|
@@ -1154,13 +1154,20 @@ static inline UIViewAnimationOptions animationOptionsWithCurve(UIViewAnimationCu
|
|
|
1154
1154
|
#pragma mark Apple TV swipe and focus handling
|
|
1155
1155
|
|
|
1156
1156
|
#if TARGET_OS_TV
|
|
1157
|
-
// Focus marker helper: traverses view hierarchy to find scrollSnapAlign
|
|
1158
|
-
// Returns the view that has the property via the output
|
|
1159
|
-
|
|
1157
|
+
// Focus marker helper: traverses view hierarchy to find either scrollSnapAlign
|
|
1158
|
+
// or scrollSnapOffset. Returns the view that has the property via the output
|
|
1159
|
+
// parameter and the marker type via outAlign/outOffset (exactly one non-nil on
|
|
1160
|
+
// return). Walk is inner→outer, latest marker wins (same as PR-1068's
|
|
1161
|
+
// scrollSnapAlign behavior). On a single view declaring both, scrollSnapOffset
|
|
1162
|
+
// wins as the more specific config.
|
|
1163
|
+
- (UIView *)findScrollSnapInView:(UIView *)view
|
|
1164
|
+
outAlign:(NSString **)outAlign
|
|
1165
|
+
outOffset:(NSNumber **)outOffset
|
|
1160
1166
|
{
|
|
1161
1167
|
UIView *testView = view;
|
|
1162
1168
|
UIView *snapTarget;
|
|
1163
|
-
NSString *
|
|
1169
|
+
NSString *align;
|
|
1170
|
+
NSNumber *offset;
|
|
1164
1171
|
|
|
1165
1172
|
while (testView && testView != self) {
|
|
1166
1173
|
if (![testView isKindOfClass:RCTViewComponentView.class])
|
|
@@ -1171,28 +1178,37 @@ static inline UIViewAnimationOptions animationOptionsWithCurve(UIViewAnimationCu
|
|
|
1171
1178
|
RCTViewComponentView *componentView = (RCTViewComponentView *)testView;
|
|
1172
1179
|
|
|
1173
1180
|
const auto &viewProps = static_cast<const facebook::react::BaseViewProps &>(*componentView.props);
|
|
1174
|
-
if (viewProps.
|
|
1175
|
-
|
|
1181
|
+
if (viewProps.scrollSnapOffset.has_value()) {
|
|
1182
|
+
offset = @(viewProps.scrollSnapOffset.value());
|
|
1183
|
+
align = nil;
|
|
1184
|
+
snapTarget = componentView;
|
|
1185
|
+
} else if (viewProps.scrollSnapAlign.has_value() && !viewProps.scrollSnapAlign.value().empty()) {
|
|
1186
|
+
align = [NSString stringWithUTF8String:viewProps.scrollSnapAlign.value().c_str()];
|
|
1187
|
+
offset = nil;
|
|
1176
1188
|
snapTarget = componentView;
|
|
1177
1189
|
}
|
|
1178
1190
|
|
|
1179
1191
|
testView = [testView superview];
|
|
1180
1192
|
}
|
|
1181
|
-
*
|
|
1182
|
-
|
|
1193
|
+
*outAlign = align;
|
|
1194
|
+
*outOffset = offset;
|
|
1195
|
+
return snapTarget;
|
|
1183
1196
|
}
|
|
1184
1197
|
|
|
1185
1198
|
- (void)_handleScrollSnapForFocusedView:(UIView *)focusedView
|
|
1186
1199
|
{
|
|
1187
1200
|
const auto &scrollProps = static_cast<const ScrollViewProps &>(*_props);
|
|
1188
|
-
|
|
1189
|
-
NSString *scrollSnapAlign =
|
|
1190
|
-
|
|
1201
|
+
|
|
1202
|
+
NSString *scrollSnapAlign = nil;
|
|
1203
|
+
NSNumber *scrollSnapOffset = nil;
|
|
1204
|
+
UIView *snapTargetView = [self findScrollSnapInView:focusedView
|
|
1205
|
+
outAlign:&scrollSnapAlign
|
|
1206
|
+
outOffset:&scrollSnapOffset];
|
|
1207
|
+
if (snapTargetView == nil || (scrollSnapAlign == nil && scrollSnapOffset == nil)) {
|
|
1191
1208
|
return;
|
|
1192
1209
|
}
|
|
1193
|
-
|
|
1194
1210
|
RCTEnhancedScrollView *scrollView = (RCTEnhancedScrollView *)_scrollView;
|
|
1195
|
-
CGRect focusedFrame = [
|
|
1211
|
+
CGRect focusedFrame = [snapTargetView convertRect:snapTargetView.bounds toView:_scrollView];
|
|
1196
1212
|
CGFloat targetOffset;
|
|
1197
1213
|
CGFloat snapToItemPadding = scrollProps.snapToItemPadding;
|
|
1198
1214
|
|
|
@@ -1212,8 +1228,12 @@ static inline UIViewAnimationOptions animationOptionsWithCurve(UIViewAnimationCu
|
|
|
1212
1228
|
currentOffset = scrollView.contentOffset.y;
|
|
1213
1229
|
maxContentSize = scrollView.contentSize.height;
|
|
1214
1230
|
}
|
|
1215
|
-
|
|
1216
|
-
if (
|
|
1231
|
+
|
|
1232
|
+
if (scrollSnapOffset != nil) {
|
|
1233
|
+
// Per-item pixel offset path: land the snap target's leading edge
|
|
1234
|
+
// at viewport coordinate = scrollSnapOffset.
|
|
1235
|
+
targetOffset = focusedOrigin - scrollSnapOffset.doubleValue;
|
|
1236
|
+
} else if ([scrollSnapAlign isEqualToString:@"start"]) {
|
|
1217
1237
|
targetOffset = focusedOrigin - snapToItemPadding;
|
|
1218
1238
|
} else if ([scrollSnapAlign isEqualToString:@"center"]) {
|
|
1219
1239
|
CGFloat viewportCenter = viewportSize / 2;
|
|
@@ -1237,8 +1257,20 @@ static inline UIViewAnimationOptions animationOptionsWithCurve(UIViewAnimationCu
|
|
|
1237
1257
|
CGPoint targetContentOffset = isHorizontalSnap
|
|
1238
1258
|
? CGPointMake(targetOffset, scrollView.contentOffset.y)
|
|
1239
1259
|
: CGPointMake(scrollView.contentOffset.x, targetOffset);
|
|
1260
|
+
// Where the focused item should snap to. We don't scroll to it here: this view's
|
|
1261
|
+
// scrollViewWillEndDragging:withVelocity:targetContentOffset: override sets
|
|
1262
|
+
// *targetContentOffset = preferredContentOffset. On tvOS the focus engine routes its
|
|
1263
|
+
// focus-driven scroll through that delegate, so the item snaps to this offset via the
|
|
1264
|
+
// engine's own scroll, even when it's already on screen. An explicit setContentOffset here
|
|
1265
|
+
// would just scroll a second time.
|
|
1266
|
+
// https://developer.apple.com/documentation/uikit/uiscrollviewdelegate/scrollviewwillenddragging(_:withvelocity:targetcontentoffset:)
|
|
1267
|
+
// https://developer.apple.com/forums/thread/22103?answerId=73300022#73300022
|
|
1240
1268
|
self.preferredContentOffset = targetContentOffset;
|
|
1241
|
-
|
|
1269
|
+
if (!scrollProps.scrollAnimationEnabled) {
|
|
1270
|
+
// Animations off: RCTEnhancedScrollView.didUpdateFocusInContext blocks the engine's
|
|
1271
|
+
// scroll, so the delegate never fires — set the offset directly.
|
|
1272
|
+
scrollView.contentOffset = targetContentOffset;
|
|
1273
|
+
}
|
|
1242
1274
|
}
|
|
1243
1275
|
|
|
1244
1276
|
- (void)didUpdateFocusInContext:(UIFocusUpdateContext *)context
|