diff --git a/apps/src/tests/TestAnimation.tsx b/apps/src/tests/TestAnimation.tsx index e4058c5df..21595ae3c 100644 --- a/apps/src/tests/TestAnimation.tsx +++ b/apps/src/tests/TestAnimation.tsx @@ -77,13 +77,18 @@ function Fifth({ navigation }: RoutePropBase<'Fifth'>): React.ReactNode { ); } +function HeaderRight() { + return ( + + ); +} + export default function App() { return ( diff --git a/ios/RNSScreenStackAnimator.mm b/ios/RNSScreenStackAnimator.mm index 65a99f284..89caf8d00 100644 --- a/ios/RNSScreenStackAnimator.mm +++ b/ios/RNSScreenStackAnimator.mm @@ -59,7 +59,7 @@ - (NSTimeInterval)transitionDuration:(id)t } if (screen != nil && screen.stackAnimation == RNSScreenStackAnimationNone) { - return 0; + return 0.0; } if (screen != nil && screen.transitionDuration != nil && [screen.transitionDuration floatValue] >= 0) { @@ -70,12 +70,6 @@ - (NSTimeInterval)transitionDuration:(id)t return _transitionDuration; } -//- (id)interruptibleAnimatorForTransition: -// (id)transitionContext -//{ -// return _inFlightAnimator; -//} - - (void)animateTransition:(id)transitionContext { UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]; @@ -489,6 +483,38 @@ - (void)animateWithNoAnimation:(id)transit } } +- (void)animateNoneWithTransitionContext:(id)transitionContext + toVC:(UIViewController *)toViewController + fromVC:(UIViewController *)fromViewController +{ + toViewController.view.frame = [transitionContext finalFrameForViewController:toViewController]; + + if (_operation == UINavigationControllerOperationPush) { + [[transitionContext containerView] addSubview:toViewController.view]; + toViewController.view.alpha = 0.0; + [UIView animateWithDuration:[self transitionDuration:transitionContext] + animations:^{ + toViewController.view.alpha = 1.0; + } + completion:^(BOOL finished) { + toViewController.view.alpha = 1.0; + [transitionContext completeTransition:![transitionContext transitionWasCancelled]]; + }]; + } else if (_operation == UINavigationControllerOperationPop) { + [[transitionContext containerView] insertSubview:toViewController.view belowSubview:fromViewController.view]; + + [UIView animateWithDuration:[self transitionDuration:transitionContext] + animations:^{ + fromViewController.view.alpha = 0.0; + } + completion:^(BOOL finished) { + fromViewController.view.alpha = 1.0; + + [transitionContext completeTransition:![transitionContext transitionWasCancelled]]; + }]; + } +} + #pragma mark - Public API - (nullable id)timingParamsForAnimationCompletion @@ -509,24 +535,35 @@ - (void)animateTransitionWithStackAnimation:(RNSScreenStackAnimation)animation toVC:(UIViewController *)toVC fromVC:(UIViewController *)fromVC { - if (animation == RNSScreenStackAnimationSimplePush) { - [self animateSimplePushWithShadowEnabled:shadowEnabled transitionContext:transitionContext toVC:toVC fromVC:fromVC]; - return; - } else if (animation == RNSScreenStackAnimationSlideFromLeft) { - [self animateSlideFromLeftWithTransitionContext:transitionContext toVC:toVC fromVC:fromVC]; - return; - } else if (animation == RNSScreenStackAnimationFade || animation == RNSScreenStackAnimationNone) { - [self animateFadeWithTransitionContext:transitionContext toVC:toVC fromVC:fromVC]; - return; - } else if (animation == RNSScreenStackAnimationSlideFromBottom) { - [self animateSlideFromBottomWithTransitionContext:transitionContext toVC:toVC fromVC:fromVC]; - return; - } else if (animation == RNSScreenStackAnimationFadeFromBottom) { - [self animateFadeFromBottomWithTransitionContext:transitionContext toVC:toVC fromVC:fromVC]; - return; + switch (animation) { + case RNSScreenStackAnimationSimplePush: + [self animateSimplePushWithShadowEnabled:shadowEnabled + transitionContext:transitionContext + toVC:toVC + fromVC:fromVC]; + return; + case RNSScreenStackAnimationSlideFromLeft: + [self animateSlideFromLeftWithTransitionContext:transitionContext toVC:toVC fromVC:fromVC]; + return; + case RNSScreenStackAnimationFade: + [self animateFadeWithTransitionContext:transitionContext toVC:toVC fromVC:fromVC]; + return; + case RNSScreenStackAnimationSlideFromBottom: + [self animateSlideFromBottomWithTransitionContext:transitionContext toVC:toVC fromVC:fromVC]; + return; + case RNSScreenStackAnimationFadeFromBottom: + [self animateFadeFromBottomWithTransitionContext:transitionContext toVC:toVC fromVC:fromVC]; + return; + case RNSScreenStackAnimationNone: + [self animateNoneWithTransitionContext:transitionContext toVC:toVC fromVC:fromVC]; + return; + default: + // simple_push is the default custom animation + [self animateSimplePushWithShadowEnabled:shadowEnabled + transitionContext:transitionContext + toVC:toVC + fromVC:fromVC]; } - // simple_push is the default custom animation - [self animateSimplePushWithShadowEnabled:shadowEnabled transitionContext:transitionContext toVC:toVC fromVC:fromVC]; } + (UISpringTimingParameters *)defaultSpringTimingParametersApprox