From 635a25e1c17958d67e6d4ab7e08bdbf39c9bc3c5 Mon Sep 17 00:00:00 2001 From: Michael Henry Pantaleon Date: Wed, 11 Dec 2019 07:07:17 +0900 Subject: [PATCH 1/2] create shortcut for initializing image carousel --- Sources/ImageCarouselViewController.swift | 24 +++++++++++++++++++++++ Sources/UIImageView_Extensions.swift | 20 ++++++------------- 2 files changed, 30 insertions(+), 14 deletions(-) diff --git a/Sources/ImageCarouselViewController.swift b/Sources/ImageCarouselViewController.swift index b5799247..16f5e9b4 100644 --- a/Sources/ImageCarouselViewController.swift +++ b/Sources/ImageCarouselViewController.swift @@ -38,6 +38,30 @@ public class ImageCarouselViewController:UIPageViewController { private(set) lazy var navItem = UINavigationItem() + public static func create( + sourceView:UIImageView, + imageDataSource: ImageDataSource?, + options:[ImageViewerOption] = [], + initialIndex:Int = 0) -> ImageCarouselViewController { + + let pageOptions = [UIPageViewController.OptionsKey.interPageSpacing: 20] + + let imageCarousel = ImageCarouselViewController( + transitionStyle: .scroll, + navigationOrientation: .horizontal, + options: pageOptions) + + imageCarousel.modalPresentationStyle = .overFullScreen + imageCarousel.modalPresentationCapturesStatusBarAppearance = true + + imageCarousel.sourceView = sourceView + imageCarousel.imageDatasource = imageDataSource + imageCarousel.options = options + imageCarousel.initialIndex = initialIndex + + return imageCarousel + } + private func addNavBar() { // Add Navigation Bar let closeBarButton = UIBarButtonItem( diff --git a/Sources/UIImageView_Extensions.swift b/Sources/UIImageView_Extensions.swift index 9dd4c7a7..205e019c 100644 --- a/Sources/UIImageView_Extensions.swift +++ b/Sources/UIImageView_Extensions.swift @@ -110,20 +110,12 @@ extension UIImageView { private func showImageViewer(_ sender:TapWithDataRecognizer) { guard let sourceView = sender.view as? UIImageView else { return } - let options = [UIPageViewController.OptionsKey.interPageSpacing: 20] - - let imageCarousel = ImageCarouselViewController( - transitionStyle: .scroll, - navigationOrientation: .horizontal, - options: options) - - imageCarousel.sourceView = sourceView - imageCarousel.imageDatasource = sender.imageDatasource - imageCarousel.initialIndex = sender.initialIndex - imageCarousel.imageDatasource = sender.imageDatasource - imageCarousel.options = sender.options - imageCarousel.modalPresentationStyle = .overFullScreen - imageCarousel.modalPresentationCapturesStatusBarAppearance = true + let imageCarousel = ImageCarouselViewController.create( + sourceView: sourceView, + imageDataSource: sender.imageDatasource, + options: sender.options, + initialIndex: sender.initialIndex) + vc?.present(imageCarousel, animated: false, completion: nil) } } From a7d6e2ca1c3a59e1602bb272b1f22cb66dc9e98c Mon Sep 17 00:00:00 2001 From: Michael Henry Pantaleon Date: Wed, 11 Dec 2019 07:07:39 +0900 Subject: [PATCH 2/2] make zoom in more natural. --- Sources/ImageViewerController.swift | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/Sources/ImageViewerController.swift b/Sources/ImageViewerController.swift index e269198a..f4090e6f 100644 --- a/Sources/ImageViewerController.swift +++ b/Sources/ImageViewerController.swift @@ -36,6 +36,7 @@ class ImageViewerController:UIViewController, UIGestureRecognizerDelegate { private var lastLocation:CGPoint = .zero private var isAnimating:Bool = false + private var maxZoomScale:CGFloat = 1.0 init(sourceView:UIImageView? = nil) { super.init(nibName: nil, bundle: nil) @@ -205,11 +206,11 @@ class ImageViewerController:UIViewController, UIGestureRecognizerDelegate { func gestureRecognizerShouldBegin( _ gestureRecognizer: UIGestureRecognizer) -> Bool { - if let panGesture = gestureRecognizer as? UIPanGestureRecognizer { - let velocity = panGesture.velocity(in: scrollView) - return abs(velocity.y) > abs(velocity.x) - } - return false + guard scrollView.zoomScale == scrollView.minimumZoomScale, + let panGesture = gestureRecognizer as? UIPanGestureRecognizer else { return false } + + let velocity = panGesture.velocity(in: scrollView) + return abs(velocity.y) > abs(velocity.x) } } @@ -217,19 +218,21 @@ class ImageViewerController:UIViewController, UIGestureRecognizerDelegate { extension ImageViewerController { func updateMinMaxZoomScaleForSize(_ size: CGSize) { - let widthScale = size.width / imageView.bounds.width - let heightScale = size.height / imageView.bounds.height + let widthScale = (size.width + 1.0) / imageView.bounds.width + let heightScale = (size.height + 1.0) / imageView.bounds.height let minScale = min(widthScale, heightScale) + let maxScale = max(widthScale, heightScale) scrollView.minimumZoomScale = minScale scrollView.zoomScale = minScale - scrollView.maximumZoomScale = max(1, minScale) * 2 + maxZoomScale = maxScale + scrollView.maximumZoomScale = maxZoomScale * 1.1 } func zoomInOrOut(at point:CGPoint) { let newZoomScale = scrollView.zoomScale == scrollView.minimumZoomScale - ? scrollView.maximumZoomScale : scrollView.minimumZoomScale + ? maxZoomScale : scrollView.minimumZoomScale let size = scrollView.bounds.size let w = size.width / newZoomScale let h = size.height / newZoomScale