diff --git a/Optik/Classes/AlbumViewController.swift b/Optik/Classes/AlbumViewController.swift index f8e70c2..4830386 100644 --- a/Optik/Classes/AlbumViewController.swift +++ b/Optik/Classes/AlbumViewController.swift @@ -80,7 +80,7 @@ internal final class AlbumViewController: UIViewController { private var cachedRemoteImages: [URL: UIImage] = [:] private var viewDidAppear: Bool = false - private var transitionController: TransitionController = TransitionController() + private var transitionController: TransitionController // MARK: - Init/Deinit @@ -88,13 +88,15 @@ internal final class AlbumViewController: UIViewController { initialImageDisplayIndex: Int, activityIndicatorColor: UIColor?, dismissButtonImage: UIImage?, - dismissButtonPosition: DismissButtonPosition) { + dismissButtonPosition: DismissButtonPosition, + transitionShadow: Bool) { self.imageData = imageData self.initialImageDisplayIndex = initialImageDisplayIndex self.activityIndicatorColor = activityIndicatorColor self.dismissButtonImage = dismissButtonImage self.dismissButtonPosition = dismissButtonPosition + self.transitionController = TransitionController(transitionShadow: transitionShadow) pageViewController = UIPageViewController(transitionStyle: .scroll, navigationOrientation: .horizontal, diff --git a/Optik/Classes/Optik.swift b/Optik/Classes/Optik.swift index 4734b38..0e3f627 100644 --- a/Optik/Classes/Optik.swift +++ b/Optik/Classes/Optik.swift @@ -18,6 +18,7 @@ import UIKit - parameter delegate: Image viewer delegate. - parameter dismissButtonImage: Image for the dismiss button. - parameter dismissButtonPosition: Dismiss button position. + - parameter transitionShadow Whether to display a shadow to the image or not during transitions. - returns: The created view controller. */ @@ -25,13 +26,14 @@ public func imageViewer(withImages images: [UIImage], initialImageDisplayIndex: Int = 0, delegate: ImageViewerDelegate? = nil, dismissButtonImage: UIImage? = nil, - dismissButtonPosition: DismissButtonPosition = .topLeading) -> UIViewController { + dismissButtonPosition: DismissButtonPosition = .topLeading, + transitionShadow: Bool = true) -> UIViewController { let albumViewController = imageViewer(withData: .local(images: images), initialImageDisplayIndex: initialImageDisplayIndex, + delegate: delegate, dismissButtonImage: dismissButtonImage, - dismissButtonPosition: dismissButtonPosition) - albumViewController.modalPresentationStyle = .custom - albumViewController.imageViewerDelegate = delegate + dismissButtonPosition: dismissButtonPosition, + transitionShadow: transitionShadow) return albumViewController } @@ -45,29 +47,36 @@ public func imageViewer(withImages images: [UIImage], - parameter activityIndicatorColor: Tint color of the activity indicator that is displayed while images are being downloaded. - parameter dismissButtonImage: Image for the dismiss button. - parameter dismissButtonPosition: Dismiss button position. + - parameter transitionShadow Whether to display a shadow to the image or not during transitions. - returns: The created view controller. */ public func imageViewer(withURLs urls: [URL], initialImageDisplayIndex: Int = 0, + delegate: ImageViewerDelegate? = nil, imageDownloader: ImageDownloader, activityIndicatorColor: UIColor = .white, dismissButtonImage: UIImage? = nil, - dismissButtonPosition: DismissButtonPosition = .topLeading) -> UIViewController { + dismissButtonPosition: DismissButtonPosition = .topLeading, + transitionShadow: Bool = true) -> UIViewController { return imageViewer(withData: .remote(urls: urls, imageDownloader: imageDownloader), initialImageDisplayIndex: initialImageDisplayIndex, + delegate: delegate, activityIndicatorColor: activityIndicatorColor, dismissButtonImage: dismissButtonImage, - dismissButtonPosition: dismissButtonPosition) + dismissButtonPosition: dismissButtonPosition, + transitionShadow: transitionShadow) } // MARK: - Private functions private func imageViewer(withData imageData: ImageData, initialImageDisplayIndex: Int, + delegate: ImageViewerDelegate? = nil, activityIndicatorColor: UIColor? = nil, dismissButtonImage: UIImage?, - dismissButtonPosition: DismissButtonPosition) -> AlbumViewController { + dismissButtonPosition: DismissButtonPosition, + transitionShadow: Bool) -> AlbumViewController { let bundle = Bundle(for: AlbumViewController.self) let defaultDismissButtonImage = UIImage(named: "DismissIcon", in: bundle, compatibleWith: nil) @@ -75,8 +84,11 @@ private func imageViewer(withData imageData: ImageData, initialImageDisplayIndex: initialImageDisplayIndex, activityIndicatorColor: activityIndicatorColor, dismissButtonImage: dismissButtonImage ?? defaultDismissButtonImage, - dismissButtonPosition: dismissButtonPosition) + dismissButtonPosition: dismissButtonPosition, + transitionShadow: transitionShadow) albumViewController.modalPresentationCapturesStatusBarAppearance = true + albumViewController.modalPresentationStyle = .custom + albumViewController.imageViewerDelegate = delegate return albumViewController } diff --git a/Optik/Classes/TransitionAnimator.swift b/Optik/Classes/TransitionAnimator.swift index b2993f7..b965215 100644 --- a/Optik/Classes/TransitionAnimator.swift +++ b/Optik/Classes/TransitionAnimator.swift @@ -37,6 +37,8 @@ internal final class TransitionAnimator: NSObject { private weak var toImageView: UIImageView? private weak var animationView: UIImageView? + private var transitionShadow: Bool + fileprivate weak var fromViewController: UIViewController? fileprivate weak var toViewController: UIViewController? @@ -45,10 +47,11 @@ internal final class TransitionAnimator: NSObject { // MARK: - Init/deinit - init(transitionType: TransitionType, fromImageView: UIImageView, toImageView: UIImageView) { + init(transitionType: TransitionType, fromImageView: UIImageView, toImageView: UIImageView, transitionShadow: Bool) { self.transitionType = transitionType self.fromImageView = fromImageView self.toImageView = toImageView + self.transitionShadow = transitionShadow super.init() } @@ -202,10 +205,12 @@ internal final class TransitionAnimator: NSObject { self.animationView = animationView animationView.frame = fromSuperView.convert(fromImageView.frame, to: transitionContainerView) - animationView.layer.shadowColor = Constants.animationViewShadowColor - animationView.layer.shadowOffset = Constants.animationViewShadowOffset - animationView.layer.shadowRadius = Constants.animationViewShadowRadius - animationView.layer.shadowOpacity = Constants.animationViewShadowOpacity + if (transitionShadow) { + animationView.layer.shadowColor = Constants.animationViewShadowColor + animationView.layer.shadowOffset = Constants.animationViewShadowOffset + animationView.layer.shadowRadius = Constants.animationViewShadowRadius + animationView.layer.shadowOpacity = Constants.animationViewShadowOpacity + } fromImageView.isHidden = true toImageView.isHidden = true diff --git a/Optik/Classes/TransitionController.swift b/Optik/Classes/TransitionController.swift index 0687e12..72312c5 100644 --- a/Optik/Classes/TransitionController.swift +++ b/Optik/Classes/TransitionController.swift @@ -31,8 +31,16 @@ internal final class TransitionController: NSObject { fileprivate var dismissTransitionAnimator: TransitionAnimator? fileprivate var shouldDismissInteractively: Bool = false + fileprivate var transitionShadow: Bool + private var lastPanTranslation: CGPoint? + // MARK: - Initializers + + init(transitionShadow: Bool) { + self.transitionShadow = transitionShadow + } + // MARK: - Instance functions /** @@ -119,7 +127,10 @@ extension TransitionController: UIViewControllerTransitioningDelegate { return nil } - return TransitionAnimator(transitionType: .present, fromImageView: fromImageView, toImageView: toImageView) + return TransitionAnimator(transitionType: .present, + fromImageView: fromImageView, + toImageView: toImageView, + transitionShadow: transitionShadow) } func animationController(forDismissed dismissed: UIViewController) @@ -132,7 +143,8 @@ extension TransitionController: UIViewControllerTransitioningDelegate { dismissTransitionAnimator = TransitionAnimator(transitionType: .dismiss, fromImageView: fromImageView, - toImageView: toImageView) + toImageView: toImageView, + transitionShadow: transitionShadow) return dismissTransitionAnimator }