@@ -147,6 +147,64 @@ - (void)animateSimplePushWithTransitionContext:(id<UIViewControllerContextTransi
147147 }
148148}
149149
150+ - (void )animateSlideFromLeftWithTransitionContext : (id <UIViewControllerContextTransitioning>)transitionContext
151+ toVC : (UIViewController *)toViewController
152+ fromVC : (UIViewController *)fromViewController
153+ {
154+ float containerWidth = transitionContext.containerView .bounds .size .width ;
155+ float belowViewWidth = containerWidth * 0.3 ;
156+
157+ CGAffineTransform rightTransform = CGAffineTransformMakeTranslation (-containerWidth, 0 );
158+ CGAffineTransform leftTransform = CGAffineTransformMakeTranslation (belowViewWidth, 0 );
159+
160+ if (toViewController.navigationController .view .semanticContentAttribute ==
161+ UISemanticContentAttributeForceRightToLeft) {
162+ rightTransform = CGAffineTransformMakeTranslation (containerWidth, 0 );
163+ leftTransform = CGAffineTransformMakeTranslation (-belowViewWidth, 0 );
164+ }
165+
166+ if (_operation == UINavigationControllerOperationPush) {
167+ toViewController.view .transform = rightTransform;
168+ [[transitionContext containerView ] addSubview: toViewController.view];
169+ [UIView animateWithDuration: [self transitionDuration: transitionContext]
170+ animations: ^{
171+ fromViewController.view .transform = leftTransform;
172+ toViewController.view .transform = CGAffineTransformIdentity;
173+ }
174+ completion: ^(BOOL finished) {
175+ fromViewController.view .transform = CGAffineTransformIdentity;
176+ toViewController.view .transform = CGAffineTransformIdentity;
177+ [transitionContext completeTransition: ![transitionContext transitionWasCancelled ]];
178+ }];
179+ } else if (_operation == UINavigationControllerOperationPop) {
180+ toViewController.view .transform = leftTransform;
181+ [[transitionContext containerView ] insertSubview: toViewController.view belowSubview: fromViewController.view];
182+
183+ void (^animationBlock)(void ) = ^{
184+ toViewController.view .transform = CGAffineTransformIdentity;
185+ fromViewController.view .transform = rightTransform;
186+ };
187+ void (^completionBlock)(BOOL ) = ^(BOOL finished) {
188+ fromViewController.view .transform = CGAffineTransformIdentity;
189+ toViewController.view .transform = CGAffineTransformIdentity;
190+ [transitionContext completeTransition: ![transitionContext transitionWasCancelled ]];
191+ };
192+
193+ if (!transitionContext.isInteractive ) {
194+ [UIView animateWithDuration: [self transitionDuration: transitionContext]
195+ animations: animationBlock
196+ completion: completionBlock];
197+ } else {
198+ // we don't want the EaseInOut option when swiping to dismiss the view, it is the same in default animation option
199+ [UIView animateWithDuration: [self transitionDuration: transitionContext]
200+ delay: 0.0
201+ options: UIViewAnimationOptionCurveLinear
202+ animations: animationBlock
203+ completion: completionBlock];
204+ }
205+ }
206+ }
207+
150208- (void )animateFadeWithTransitionContext : (id <UIViewControllerContextTransitioning>)transitionContext
151209 toVC : (UIViewController *)toViewController
152210 fromVC : (UIViewController *)fromViewController
@@ -330,6 +388,9 @@ - (void)animateTransitionWithStackAnimation:(RNSScreenStackAnimation)animation
330388 if (animation == RNSScreenStackAnimationSimplePush) {
331389 [self animateSimplePushWithTransitionContext: transitionContext toVC: toVC fromVC: fromVC];
332390 return ;
391+ } else if (animation == RNSScreenStackAnimationSlideFromLeft) {
392+ [self animateSlideFromLeftWithTransitionContext: transitionContext toVC: toVC fromVC: fromVC];
393+ return ;
333394 } else if (animation == RNSScreenStackAnimationFade || animation == RNSScreenStackAnimationNone) {
334395 [self animateFadeWithTransitionContext: transitionContext toVC: toVC fromVC: fromVC];
335396 return ;
0 commit comments