Skip to content

Commit 9b489ac

Browse files
authored
smoother dismiss of modal with transparent coloring (#8217)
1 parent ffc40de commit 9b489ac

1 file changed

Lines changed: 29 additions & 24 deletions

File tree

ios/ScreenAnimationController.mm

Lines changed: 29 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -75,21 +75,13 @@ - (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionCo
7575
}
7676

7777
- (void)prepareTransitionContext:(id<UIViewControllerContextTransitioning>)transitionContext {
78-
UIViewController *fromViewController =
79-
[transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
8078
UIViewController *toViewController =
8179
[transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
8280

8381
UIView *fromView = [transitionContext viewForKey:UITransitionContextFromViewKey];
8482
UIView *toView = [transitionContext viewForKey:UITransitionContextToViewKey];
8583

86-
BOOL isDismiss = (toView == nil);
87-
88-
if (isDismiss) {
89-
if (fromView) {
90-
[transitionContext.containerView addSubview:fromView];
91-
}
92-
} else {
84+
if (toView) {
9385
toViewController.view.alpha = 0;
9486
if (fromView) {
9587
[transitionContext.containerView addSubview:fromView];
@@ -137,26 +129,39 @@ - (void)performAnimationOnce {
137129
- (void)animateTransitions:(NSArray<id<DisplayLinkAnimatorDelegate>> *)animators
138130
andTransitioningContext:(id<UIViewControllerContextTransitioning>)transitionContext {
139131
UIView *toView = [transitionContext viewForKey:UITransitionContextToViewKey];
132+
UIViewController *fromVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
133+
140134
BOOL isDismiss = (toView == nil);
141135

142-
DisplayLinkAnimator *displayLinkAnimator = [[DisplayLinkAnimator alloc]
143-
initWithDisplayLinkAnimators:animators
144-
duration:[self transitionDuration:transitionContext]];
145-
146-
[displayLinkAnimator setOnStart:^{
147-
UIViewController *toVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
136+
if (isDismiss) {
137+
[UIView animateWithDuration:[self transitionDuration:transitionContext]
138+
animations:^{
139+
fromVC.view.alpha = 0;
140+
} completion:^(BOOL finished) {
141+
[transitionContext completeTransition:![transitionContext transitionWasCancelled]];
142+
fromVC.view.alpha = 1;
143+
}];
144+
return;
145+
}
146+
147+
DisplayLinkAnimator *displayLinkAnimator = [[DisplayLinkAnimator alloc]
148+
initWithDisplayLinkAnimators:animators
149+
duration:[self transitionDuration:transitionContext]];
150+
151+
[displayLinkAnimator setOnStart:^{
148152
if (!isDismiss) {
153+
UIViewController *toVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
149154
toVC.view.alpha = 1.f;
150155
}
151-
}];
152-
153-
[displayLinkAnimator setCompletion:^{
154-
if (![transitionContext transitionWasCancelled]) {
155-
[transitionContext completeTransition:![transitionContext transitionWasCancelled]];
156-
}
157-
}];
158-
159-
[displayLinkAnimator start];
156+
}];
157+
158+
[displayLinkAnimator setCompletion:^{
159+
if (![transitionContext transitionWasCancelled]) {
160+
[transitionContext completeTransition:![transitionContext transitionWasCancelled]];
161+
}
162+
}];
163+
164+
[displayLinkAnimator start];
160165
}
161166

162167
- (NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext {

0 commit comments

Comments
 (0)