From 05659656460e11a4fda4e7a6ab0adac4630f3e22 Mon Sep 17 00:00:00 2001 From: Andreas Date: Tue, 27 Feb 2018 17:13:45 +0100 Subject: [PATCH 1/6] alpha to 0 instead of isHidden to true Instead of hiding the source of a transition by setting 'isHidden' property (which will cause a UIStackView to relayout), the alpha value is set to 0 to hide the source view in another way. --- ImageViewer/Transitions/ImageViewerDismissalTransition.swift | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ImageViewer/Transitions/ImageViewerDismissalTransition.swift b/ImageViewer/Transitions/ImageViewerDismissalTransition.swift index 545c72f..07d3337 100644 --- a/ImageViewer/Transitions/ImageViewerDismissalTransition.swift +++ b/ImageViewer/Transitions/ImageViewerDismissalTransition.swift @@ -75,6 +75,7 @@ final class ImageViewerDismissalTransition: NSObject, UIViewControllerAnimatedTr animations: apply(state: .start), completion: { _ in self.fromView?.isHidden = false + self.toImageView.alpha = 1 self.animatableImageview.removeFromSuperview() self.fadeView.removeFromSuperview() self.transitionContext?.completeTransition(false) @@ -88,9 +89,11 @@ final class ImageViewerDismissalTransition: NSObject, UIViewControllerAnimatedTr animations: apply(state: .end), completion: { _ in self.toImageView.isHidden = false + self.toImageView.alpha = 1 self.fadeView.removeFromSuperview() self.animatableImageview.removeFromSuperview() - self.fromView?.removeFromSuperview() +// self.fromView?.removeFromSuperview() + self.fromView?.alpha = 0 self.transitionContext?.completeTransition(true) }) } From ab44a56f4967e55b52e445a7abefffe3503e643f Mon Sep 17 00:00:00 2001 From: Andreas Date: Wed, 28 Feb 2018 08:58:12 +0100 Subject: [PATCH 2/6] alpha to 0 instead of isHidden to true continued. --- .../Transitions/ImageViewerDismissalTransition.swift | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ImageViewer/Transitions/ImageViewerDismissalTransition.swift b/ImageViewer/Transitions/ImageViewerDismissalTransition.swift index 07d3337..5b42cc1 100644 --- a/ImageViewer/Transitions/ImageViewerDismissalTransition.swift +++ b/ImageViewer/Transitions/ImageViewerDismissalTransition.swift @@ -59,7 +59,8 @@ final class ImageViewerDismissalTransition: NSObject, UIViewControllerAnimatedTr animatableImageview.frame = fromSuperView.convert(fromImageView.frame, to: nil) animatableImageview.contentMode = .scaleAspectFit - fromView?.isHidden = true +// fromView?.isHidden = true + fromView?.alpha = 0 fadeView.frame = containerView.bounds fadeView.backgroundColor = .black @@ -74,7 +75,8 @@ final class ImageViewerDismissalTransition: NSObject, UIViewControllerAnimatedTr options: .curveEaseInOut, animations: apply(state: .start), completion: { _ in - self.fromView?.isHidden = false +// self.fromView?.isHidden = false + self.fromView?.alpha = 1 self.toImageView.alpha = 1 self.animatableImageview.removeFromSuperview() self.fadeView.removeFromSuperview() From 34d840b3a6ccbc4ee61f80fbef0e4c92430debd6 Mon Sep 17 00:00:00 2001 From: Andreas Date: Wed, 28 Feb 2018 09:04:44 +0100 Subject: [PATCH 3/6] Working alpha to 0 instead of isHidden to true --- .../ImageViewerPresentationTransition.swift | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/ImageViewer/Transitions/ImageViewerPresentationTransition.swift b/ImageViewer/Transitions/ImageViewerPresentationTransition.swift index 0f97d78..e0e8324 100644 --- a/ImageViewer/Transitions/ImageViewerPresentationTransition.swift +++ b/ImageViewer/Transitions/ImageViewerPresentationTransition.swift @@ -16,7 +16,7 @@ final class ImageViewerPresentationTransition: NSObject, UIViewControllerAnimate let containerView = transitionContext.containerView let toView = transitionContext.view(forKey: UITransitionContextViewKey.to)! let fromParentView = fromImageView.superview! - + let imageView = AnimatableImageView() imageView.image = fromImageView.image imageView.frame = fromParentView.convert(fromImageView.frame, to: nil) @@ -28,7 +28,8 @@ final class ImageViewerPresentationTransition: NSObject, UIViewControllerAnimate toView.frame = containerView.bounds toView.isHidden = true - fromImageView.isHidden = true + // fromImageView.isHidden = true + fromImageView.alpha = 0 containerView.addSubview(toView) containerView.addSubview(fadeView) @@ -39,14 +40,16 @@ final class ImageViewerPresentationTransition: NSObject, UIViewControllerAnimate usingSpringWithDamping: 0.8, initialSpringVelocity: 0, options: .curveEaseOut, animations: { - imageView.contentMode = .scaleAspectFit - imageView.frame = containerView.bounds - fadeView.alpha = 1.0 + imageView.contentMode = .scaleAspectFit + imageView.frame = containerView.bounds + fadeView.alpha = 1.0 }, completion: { _ in toView.isHidden = false + toView.alpha = 1 fadeView.removeFromSuperview() imageView.removeFromSuperview() transitionContext.completeTransition(true) }) } } + From 87c6a5f2902372fb1e2259da23379d658dbc8ec1 Mon Sep 17 00:00:00 2001 From: Andreas Date: Tue, 27 Feb 2018 17:13:45 +0100 Subject: [PATCH 4/6] alpha to 0 instead of isHidden to true Instead of hiding the source of a transition by setting 'isHidden' property (which will cause a UIStackView to relayout), the alpha value is set to 0 to hide the source view in another way. --- .../ImageViewerDismissalTransition.swift | 11 ++++++++--- .../ImageViewerPresentationTransition.swift | 13 ++++++++----- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/ImageViewer/Transitions/ImageViewerDismissalTransition.swift b/ImageViewer/Transitions/ImageViewerDismissalTransition.swift index 545c72f..5b42cc1 100644 --- a/ImageViewer/Transitions/ImageViewerDismissalTransition.swift +++ b/ImageViewer/Transitions/ImageViewerDismissalTransition.swift @@ -59,7 +59,8 @@ final class ImageViewerDismissalTransition: NSObject, UIViewControllerAnimatedTr animatableImageview.frame = fromSuperView.convert(fromImageView.frame, to: nil) animatableImageview.contentMode = .scaleAspectFit - fromView?.isHidden = true +// fromView?.isHidden = true + fromView?.alpha = 0 fadeView.frame = containerView.bounds fadeView.backgroundColor = .black @@ -74,7 +75,9 @@ final class ImageViewerDismissalTransition: NSObject, UIViewControllerAnimatedTr options: .curveEaseInOut, animations: apply(state: .start), completion: { _ in - self.fromView?.isHidden = false +// self.fromView?.isHidden = false + self.fromView?.alpha = 1 + self.toImageView.alpha = 1 self.animatableImageview.removeFromSuperview() self.fadeView.removeFromSuperview() self.transitionContext?.completeTransition(false) @@ -88,9 +91,11 @@ final class ImageViewerDismissalTransition: NSObject, UIViewControllerAnimatedTr animations: apply(state: .end), completion: { _ in self.toImageView.isHidden = false + self.toImageView.alpha = 1 self.fadeView.removeFromSuperview() self.animatableImageview.removeFromSuperview() - self.fromView?.removeFromSuperview() +// self.fromView?.removeFromSuperview() + self.fromView?.alpha = 0 self.transitionContext?.completeTransition(true) }) } diff --git a/ImageViewer/Transitions/ImageViewerPresentationTransition.swift b/ImageViewer/Transitions/ImageViewerPresentationTransition.swift index 0f97d78..e0e8324 100644 --- a/ImageViewer/Transitions/ImageViewerPresentationTransition.swift +++ b/ImageViewer/Transitions/ImageViewerPresentationTransition.swift @@ -16,7 +16,7 @@ final class ImageViewerPresentationTransition: NSObject, UIViewControllerAnimate let containerView = transitionContext.containerView let toView = transitionContext.view(forKey: UITransitionContextViewKey.to)! let fromParentView = fromImageView.superview! - + let imageView = AnimatableImageView() imageView.image = fromImageView.image imageView.frame = fromParentView.convert(fromImageView.frame, to: nil) @@ -28,7 +28,8 @@ final class ImageViewerPresentationTransition: NSObject, UIViewControllerAnimate toView.frame = containerView.bounds toView.isHidden = true - fromImageView.isHidden = true + // fromImageView.isHidden = true + fromImageView.alpha = 0 containerView.addSubview(toView) containerView.addSubview(fadeView) @@ -39,14 +40,16 @@ final class ImageViewerPresentationTransition: NSObject, UIViewControllerAnimate usingSpringWithDamping: 0.8, initialSpringVelocity: 0, options: .curveEaseOut, animations: { - imageView.contentMode = .scaleAspectFit - imageView.frame = containerView.bounds - fadeView.alpha = 1.0 + imageView.contentMode = .scaleAspectFit + imageView.frame = containerView.bounds + fadeView.alpha = 1.0 }, completion: { _ in toView.isHidden = false + toView.alpha = 1 fadeView.removeFromSuperview() imageView.removeFromSuperview() transitionContext.completeTransition(true) }) } } + From 66ae0bbce2210bc2cea65b08970b160b30f5685d Mon Sep 17 00:00:00 2001 From: Andreas Date: Tue, 2 Oct 2018 16:40:17 +0200 Subject: [PATCH 5/6] Added comments. --- .gitignore | 3 ++- .../Transitions/ImageViewerDismissalTransition.swift | 6 +++++- .../Transitions/ImageViewerPresentationTransition.swift | 1 + 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index a33eb7a..a4b4a49 100644 --- a/.gitignore +++ b/.gitignore @@ -64,4 +64,5 @@ Carthage/Build fastlane/report.xml fastlane/Preview.html fastlane/screenshots -fastlane/test_output \ No newline at end of file +fastlane/test_output +.DS_Store diff --git a/ImageViewer/Transitions/ImageViewerDismissalTransition.swift b/ImageViewer/Transitions/ImageViewerDismissalTransition.swift index 5b42cc1..d59c24a 100644 --- a/ImageViewer/Transitions/ImageViewerDismissalTransition.swift +++ b/ImageViewer/Transitions/ImageViewerDismissalTransition.swift @@ -59,6 +59,8 @@ final class ImageViewerDismissalTransition: NSObject, UIViewControllerAnimatedTr animatableImageview.frame = fromSuperView.convert(fromImageView.frame, to: nil) animatableImageview.contentMode = .scaleAspectFit + + // Do not hide the view by setting its 'isHidden' property. A UIStackView removes hidden subviews from the visual hierarchy. Therefore, the layout jumps when switched to visible after dismissal. // fromView?.isHidden = true fromView?.alpha = 0 fadeView.frame = containerView.bounds @@ -75,6 +77,8 @@ final class ImageViewerDismissalTransition: NSObject, UIViewControllerAnimatedTr options: .curveEaseInOut, animations: apply(state: .start), completion: { _ in + + // Do not hide the view by setting its 'isHidden' property. A UIStackView removes hidden subviews from the visual hierarchy. Therefore, the layout jumps when switched to visible after dismissal. // self.fromView?.isHidden = false self.fromView?.alpha = 1 self.toImageView.alpha = 1 @@ -94,7 +98,7 @@ final class ImageViewerDismissalTransition: NSObject, UIViewControllerAnimatedTr self.toImageView.alpha = 1 self.fadeView.removeFromSuperview() self.animatableImageview.removeFromSuperview() -// self.fromView?.removeFromSuperview() + self.fromView?.removeFromSuperview() self.fromView?.alpha = 0 self.transitionContext?.completeTransition(true) }) diff --git a/ImageViewer/Transitions/ImageViewerPresentationTransition.swift b/ImageViewer/Transitions/ImageViewerPresentationTransition.swift index e0e8324..4394246 100644 --- a/ImageViewer/Transitions/ImageViewerPresentationTransition.swift +++ b/ImageViewer/Transitions/ImageViewerPresentationTransition.swift @@ -28,6 +28,7 @@ final class ImageViewerPresentationTransition: NSObject, UIViewControllerAnimate toView.frame = containerView.bounds toView.isHidden = true + // Do not hide the view by setting its 'isHidden' property. A UIStackView removes hidden subviews from the visual hierarchy. Therefore, the layout jumps when switched to visible after dismissal. // fromImageView.isHidden = true fromImageView.alpha = 0 From f0edfd44da49a37dd30aac2f960f3c2686c528e6 Mon Sep 17 00:00:00 2001 From: Andreas Date: Tue, 2 Oct 2018 17:08:20 +0200 Subject: [PATCH 6/6] Missed fixing the important line. --- ImageViewer/Transitions/ImageViewerPresentationTransition.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ImageViewer/Transitions/ImageViewerPresentationTransition.swift b/ImageViewer/Transitions/ImageViewerPresentationTransition.swift index 4394246..db15ac9 100644 --- a/ImageViewer/Transitions/ImageViewerPresentationTransition.swift +++ b/ImageViewer/Transitions/ImageViewerPresentationTransition.swift @@ -27,7 +27,7 @@ final class ImageViewerPresentationTransition: NSObject, UIViewControllerAnimate fadeView.alpha = 0.0 toView.frame = containerView.bounds - toView.isHidden = true +// toView.isHidden = true // Do not hide the view by setting its 'isHidden' property. A UIStackView removes hidden subviews from the visual hierarchy. Therefore, the layout jumps when switched to visible after dismissal. // fromImageView.isHidden = true fromImageView.alpha = 0