Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions apps/App.tsx
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import React from 'react';
import { enableFreeze } from 'react-native-screens';
import Example from './Example';
// import * as Test from './src/tests';
// import Example from './Example';
import * as Test from './src/tests';

enableFreeze(true);

export default function App() {
return <Example />;
// return <Test.TestBottomTabs />;
// return <Example />;
return <Test.TestBottomTabs />;
}
7 changes: 2 additions & 5 deletions apps/src/tests/Test1072.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,6 @@ export default function App() {
<Stack.Navigator
screenOptions={{
fullScreenGestureEnabled: true,
animation: 'fade_from_bottom',
animationMatchesGesture: true,
}}>
<Stack.Screen name="First" component={First} />
<Stack.Screen name="Second" component={Second} />
Expand Down Expand Up @@ -84,9 +82,8 @@ function generatePhotos(
): JSX.Element[] {
const startFrom = Math.floor(Math.random() * 20) + 10;
return Array.from({ length: amount }, (_, index) => {
const uri = `https://picsum.photos/id/${
startFrom + index
}/${width}/${height}`;
const uri = `https://picsum.photos/id/${startFrom + index
}/${width}/${height}`;
return <Image style={{ width, height }} key={uri} source={{ uri }} />;
});
}
Expand Down
3 changes: 1 addition & 2 deletions apps/src/tests/TestBottomTabs/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ const TAB_CONFIGS: TabConfiguration[] = [
selectedIcon: {
sfSymbolName: 'house.fill',
},
// iconResourceName: 'sym_call_incoming', // Android specific
iconResourceName: 'sym_call_incoming', // Android specific
iconResource: require('../../../assets/variableIcons/icon_fill.png'),
},
component: Tab1,
Expand Down Expand Up @@ -104,7 +104,6 @@ const TAB_CONFIGS: TabConfiguration[] = [
iconResourceName: 'sym_call_missed', // Android specific
iconResource: require('../../../assets/variableIcons/icon.png'),
title: 'Tab2',
orientation: 'landscape',
},
component: Tab2,
safeAreaConfiguration: {
Expand Down
49 changes: 44 additions & 5 deletions ios/RNSScreenStack.mm
Original file line number Diff line number Diff line change
Expand Up @@ -895,7 +895,9 @@ - (void)cancelTouchesInParent

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
NSLog(@"GR should begin: %@", gestureRecognizer);
if (_disableSwipeBack) {
NSLog(@"Return: NO");
return NO;
}
RNSScreenView *topScreen = _reactSubviews.lastObject;
Expand All @@ -919,15 +921,19 @@ - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
if (customAnimationOnSwipePropSetAndSelectedAnimationIsCustom) {
_isFullWidthSwipingWithPanGesture = YES;
[self cancelTouchesInParent];
NSLog(@"Return: YES");
return YES;
}
NSLog(@"Return: NO");
return NO;
} else {
if ([self isInGestureResponseDistance:gestureRecognizer topScreen:topScreen]) {
_isFullWidthSwipingWithPanGesture = YES;
[self cancelTouchesInParent];
NSLog(@"Return: YES");
return YES;
}
NSLog(@"Return: NO");
return NO;
}
}
Expand All @@ -945,17 +951,21 @@ - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
(isRTL && isSlideFromLeft && edges == UIRectEdgeLeft) || (!isRTL && edges == UIRectEdgeLeft);
if (isCorrectEdge) {
[self cancelTouchesInParent];
NSLog(@"Return: YES");
return YES;
}
}
NSLog(@"Return: NO");
return NO;
} else {
if ([gestureRecognizer isKindOfClass:[RNSScreenEdgeGestureRecognizer class]]) {
// it should only recognize with `customAnimationOnSwipe` set
NSLog(@"Return: NO");
return NO;
}
// _UIParallaxTransitionPanGestureRecognizer (other...)
[self cancelTouchesInParent];
NSLog(@"Return: YES");
return YES;
}

Expand Down Expand Up @@ -1177,6 +1187,7 @@ - (BOOL)isScrollViewPanGestureRecognizer:(UIGestureRecognizer *)gestureRecognize
// Be careful when adding another type of gesture recognizer.
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceivePressOrTouchEvent:(NSObject *)event
{
NSLog(@"GR shouldReceiveEvent %@", gestureRecognizer);
RNSScreenView *topScreen = _reactSubviews.lastObject;

for (RNSScreenView *s in _reactSubviews.reverseObjectEnumerator) {
Expand All @@ -1190,6 +1201,7 @@ - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceive

if (![topScreen isKindOfClass:[RNSScreenView class]] || !topScreen.gestureEnabled ||
_controller.viewControllers.count < 2 || [topScreen isModal]) {
NSLog(@"Return NO - early return");
return NO;
}

Expand All @@ -1202,12 +1214,26 @@ - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceive
// either interactiveContentPopGestureRecognizer or RNSPanGestureRecognizer,
// then we allow them to proceed iff full screen swipe is enabled.
if ([gestureRecognizer isKindOfClass:[RNSPanGestureRecognizer class]]) {
return customAnimationOnSwipePropSetAndSelectedAnimationIsCustom ? topScreen.isFullScreenSwipeEffectivelyEnabled
: NO;
const BOOL rv = customAnimationOnSwipePropSetAndSelectedAnimationIsCustom
? topScreen.isFullScreenSwipeEffectivelyEnabled
: NO;
NSLog(@"Return %d - gr custom + fullscreenenabled", rv);
return rv;
}
if (gestureRecognizer == _controller.interactiveContentPopGestureRecognizer) {
return customAnimationOnSwipePropSetAndSelectedAnimationIsCustom ? NO
: topScreen.isFullScreenSwipeEffectivelyEnabled;
const BOOL rv = customAnimationOnSwipePropSetAndSelectedAnimationIsCustom
? NO
: topScreen.isFullScreenSwipeEffectivelyEnabled;
NSLog(@"Return %d - gr ICPGR + fullscreenenabled", rv);
return rv;
}
if ([gestureRecognizer isKindOfClass:[RNSScreenEdgeGestureRecognizer class]]) {
const BOOL rv = customAnimationOnSwipePropSetAndSelectedAnimationIsCustom ? YES : NO;
return rv;
}
if (gestureRecognizer == _controller.interactivePopGestureRecognizer) {
const BOOL rv = customAnimationOnSwipePropSetAndSelectedAnimationIsCustom ? NO : YES;
return rv;
}
} else {
// We want to pass events to RNSPanGestureRecognizer iff full screen swipe is enabled.
Expand All @@ -1223,12 +1249,14 @@ - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceive
#endif // check for iOS >= 26

// RNSScreenEdgeGestureRecognizer || _UIParallaxTransitionPanGestureRecognizer
NSLog(@"Return YES - fallback");
return YES;
}

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceivePress:(UIPress *)press;
{
return [self gestureRecognizer:gestureRecognizer shouldReceivePressOrTouchEvent:press];
const BOOL rv = [self gestureRecognizer:gestureRecognizer shouldReceivePressOrTouchEvent:press];
return rv;
}

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch;
Expand All @@ -1239,33 +1267,44 @@ - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceive
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
NSLog(@"GR shouldRecognizeSIMULTANEOUSLY");
NSLog(@"First: %@", gestureRecognizer);
NSLog(@"Second: %@", otherGestureRecognizer);
if ([gestureRecognizer isKindOfClass:[RNSPanGestureRecognizer class]] &&
[self isScrollViewPanGestureRecognizer:otherGestureRecognizer]) {
RNSPanGestureRecognizer *panGestureRecognizer = (RNSPanGestureRecognizer *)gestureRecognizer;
BOOL isBackGesture = [panGestureRecognizer translationInView:panGestureRecognizer.view].x > 0 &&
_controller.viewControllers.count > 1;

if (gestureRecognizer.state == UIGestureRecognizerStateBegan || isBackGesture) {
NSLog(@"Return NO - RNSPanGR + Scrollview + began state or back gesture");
return NO;
}

NSLog(@"Return YES - RNSPanGR + Scrollview");
return YES;
}

NSLog(@"Return NO");
return NO;
}

#if RNS_IPHONE_OS_VERSION_AVAILABLE(26_0)
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
shouldRequireFailureOfGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
NSLog(@"GR shouldRequireFailure");
NSLog(@"First: %@", gestureRecognizer);
NSLog(@"Second: %@", otherGestureRecognizer);
if (@available(iOS 26, *)) {
if (gestureRecognizer == _controller.interactiveContentPopGestureRecognizer &&
[self isScrollViewPanGestureRecognizer:otherGestureRecognizer]) {
NSLog(@"Return YES - ICPGR + Scrollview");
return YES;
}
}

NSLog(@"Return NO");
return NO;
}
#endif // check for iOS >= 26
Expand Down
Loading