From 0c640563cd463f408e9363f27e9e3c43a8b887e3 Mon Sep 17 00:00:00 2001 From: Michael Henry Pantaleon Date: Wed, 4 Dec 2019 11:15:23 +0900 Subject: [PATCH 1/8] right nav bar item --- RightNavItemDelegate.swift | 8 ++++++ Sources/ImageCarouselViewController.swift | 33 +++++++++++++++++------ Sources/ImageViewerOption.swift | 1 + Sources/RightNavItemDelegate.swift | 4 +++ 4 files changed, 38 insertions(+), 8 deletions(-) create mode 100644 RightNavItemDelegate.swift create mode 100644 Sources/RightNavItemDelegate.swift diff --git a/RightNavItemDelegate.swift b/RightNavItemDelegate.swift new file mode 100644 index 00000000..6f1771e8 --- /dev/null +++ b/RightNavItemDelegate.swift @@ -0,0 +1,8 @@ +// +// RightNavItemDelegate.swift +// AppAuth +// +// Created by Michael Henry Pantaleon on 2019/12/04. +// + +import Foundation diff --git a/Sources/ImageCarouselViewController.swift b/Sources/ImageCarouselViewController.swift index fb6f58cd..858f9e48 100644 --- a/Sources/ImageCarouselViewController.swift +++ b/Sources/ImageCarouselViewController.swift @@ -5,7 +5,7 @@ public protocol ImageDataSource:class { func imageItem(at index:Int) -> ImageItem } -class ImageCarouselViewController:UIPageViewController { +public class ImageCarouselViewController:UIPageViewController { weak var imageDatasource:ImageDataSource? var initialIndex = 0 @@ -19,6 +19,8 @@ class ImageCarouselViewController:UIPageViewController { var options:[ImageViewerOption] = [] + weak var rightNavItemDelegate:RightNavItemDelegate? + private(set) lazy var navBar:UINavigationBar = { let _navBar = UINavigationBar(frame: .zero) _navBar.isTranslucent = true @@ -42,7 +44,7 @@ class ImageCarouselViewController:UIPageViewController { title: NSLocalizedString("Close", comment: "Close button title"), style: .plain, target: self, - action: #selector(dismiss(_:))) + action: #selector(dismissMe)) navItem.leftBarButtonItem = closeBarButton navItem.leftBarButtonItem?.tintColor = theme.tintColor @@ -65,11 +67,18 @@ class ImageCarouselViewController:UIPageViewController { self.theme = theme case .closeIcon(let icon): navItem.leftBarButtonItem?.image = icon + case .rightNavItemTitle(let title, let delegate): + navItem.rightBarButtonItem = UIBarButtonItem( + title: title, + style: .plain, + target: self, + action: #selector(diTapRightNavBarItem(_:))) + rightNavItemDelegate = delegate } } } - override func viewDidLoad() { + override public func viewDidLoad() { super.viewDidLoad() addBackgroundView() @@ -92,7 +101,7 @@ class ImageCarouselViewController:UIPageViewController { setViewControllers([initialVC], direction: .forward, animated: true, completion: nil) } - override func viewDidAppear(_ animated: Bool) { + override public func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) UIView.animate(withDuration: 0.235) { self.navBar.alpha = 1.0 @@ -100,7 +109,7 @@ class ImageCarouselViewController:UIPageViewController { } @objc - func dismiss(_ sender:UIBarButtonItem?) { + public func dismissMe() { sourceView.alpha = 1.0 UIView.animate(withDuration: 0.235, animations: { self.view.alpha = 0.0 @@ -109,7 +118,15 @@ class ImageCarouselViewController:UIPageViewController { } } - override var preferredStatusBarStyle: UIStatusBarStyle { + @objc + func diTapRightNavBarItem(_ sender:UIBarButtonItem) { + guard let _delegate = rightNavItemDelegate, + let _firstVC = viewControllers?.first as? ImageViewerController + else { return } + _delegate.imageViewer(self, didTapRightNavItem: _firstVC.index) + } + + override public var preferredStatusBarStyle: UIStatusBarStyle { if theme == .dark { return .lightContent } @@ -118,7 +135,7 @@ class ImageCarouselViewController:UIPageViewController { } extension ImageCarouselViewController:UIPageViewControllerDataSource { - func pageViewController( + public func pageViewController( _ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? { @@ -135,7 +152,7 @@ extension ImageCarouselViewController:UIPageViewControllerDataSource { delegate: self) } - func pageViewController( + public func pageViewController( _ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? { diff --git a/Sources/ImageViewerOption.swift b/Sources/ImageViewerOption.swift index 0504ba7f..8b2337d9 100644 --- a/Sources/ImageViewerOption.swift +++ b/Sources/ImageViewerOption.swift @@ -4,4 +4,5 @@ public enum ImageViewerOption { case theme(ImageViewerTheme) case closeIcon(UIImage) + case rightNavItemTitle(String, delegate: RightNavItemDelegate?) } diff --git a/Sources/RightNavItemDelegate.swift b/Sources/RightNavItemDelegate.swift new file mode 100644 index 00000000..3dd1f4dd --- /dev/null +++ b/Sources/RightNavItemDelegate.swift @@ -0,0 +1,4 @@ + +public protocol RightNavItemDelegate:class { + func imageViewer(_ imageViewer: ImageCarouselViewController, didTapRightNavItem index:Int) +} From b6b560d819a1dd7dcbb72b9d3fe0a1eb70fa175c Mon Sep 17 00:00:00 2001 From: Michael Henry Pantaleon Date: Wed, 4 Dec 2019 11:15:34 +0900 Subject: [PATCH 2/8] removed --- RightNavItemDelegate.swift | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 RightNavItemDelegate.swift diff --git a/RightNavItemDelegate.swift b/RightNavItemDelegate.swift deleted file mode 100644 index 6f1771e8..00000000 --- a/RightNavItemDelegate.swift +++ /dev/null @@ -1,8 +0,0 @@ -// -// RightNavItemDelegate.swift -// AppAuth -// -// Created by Michael Henry Pantaleon on 2019/12/04. -// - -import Foundation From a8f436583e5b65b1f776927ad34896f2e6e12d28 Mon Sep 17 00:00:00 2001 From: Michael Henry Pantaleon Date: Thu, 5 Dec 2019 07:09:47 +0900 Subject: [PATCH 3/8] added new option for right nav item --- Sources/ImageCarouselViewController.swift | 33 ++++++++++++++--------- Sources/ImageViewerOption.swift | 1 + 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/Sources/ImageCarouselViewController.swift b/Sources/ImageCarouselViewController.swift index 858f9e48..afaf9e8e 100644 --- a/Sources/ImageCarouselViewController.swift +++ b/Sources/ImageCarouselViewController.swift @@ -63,17 +63,24 @@ public class ImageCarouselViewController:UIPageViewController { options.forEach { switch $0 { - case .theme(let theme): - self.theme = theme - case .closeIcon(let icon): - navItem.leftBarButtonItem?.image = icon - case .rightNavItemTitle(let title, let delegate): - navItem.rightBarButtonItem = UIBarButtonItem( - title: title, - style: .plain, - target: self, - action: #selector(diTapRightNavBarItem(_:))) - rightNavItemDelegate = delegate + case .theme(let theme): + self.theme = theme + case .closeIcon(let icon): + navItem.leftBarButtonItem?.image = icon + case .rightNavItemTitle(let title, let delegate): + navItem.rightBarButtonItem = UIBarButtonItem( + title: title, + style: .plain, + target: self, + action: #selector(diTapRightNavBarItem(_:))) + rightNavItemDelegate = delegate + case .rightNavItemIcon(let icon, let delegate): + navItem.rightBarButtonItem = UIBarButtonItem( + image: icon, + style: .plain, + target: self, + action: #selector(diTapRightNavBarItem(_:))) + rightNavItemDelegate = delegate } } } @@ -109,12 +116,12 @@ public class ImageCarouselViewController:UIPageViewController { } @objc - public func dismissMe() { + public func dismissMe(completion: (() -> Void)? = nil) { sourceView.alpha = 1.0 UIView.animate(withDuration: 0.235, animations: { self.view.alpha = 0.0 }) { _ in - self.dismiss(animated: false, completion: nil) + self.dismiss(animated: false, completion: completion) } } diff --git a/Sources/ImageViewerOption.swift b/Sources/ImageViewerOption.swift index 8b2337d9..142e0993 100644 --- a/Sources/ImageViewerOption.swift +++ b/Sources/ImageViewerOption.swift @@ -5,4 +5,5 @@ public enum ImageViewerOption { case theme(ImageViewerTheme) case closeIcon(UIImage) case rightNavItemTitle(String, delegate: RightNavItemDelegate?) + case rightNavItemIcon(UIImage, delegate: RightNavItemDelegate?) } From 5bd68142fd92451d2af7fbfa9ee443daeb9c43bd Mon Sep 17 00:00:00 2001 From: Michael Henry Pantaleon Date: Thu, 5 Dec 2019 07:10:16 +0900 Subject: [PATCH 4/8] update sample project --- Example/Demo/Data.swift | 17 ++++++++++++++++- Example/Demo/ExampleListViewController.swift | 5 +++++ Example/Demo/WithURLsViewController.swift | 12 +++++++++++- 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/Example/Demo/Data.swift b/Example/Demo/Data.swift index a2802e67..ebf2db75 100644 --- a/Example/Demo/Data.swift +++ b/Example/Demo/Data.swift @@ -7,7 +7,22 @@ struct Data { "cat2", "cat3", "cat4", - "cat5" + "cat5", + "cat1", + "cat2", + "cat3", + "cat4", + "cat5", + "cat1", + "cat2", + "cat3", + "cat4", + "cat5", + "cat1", + "cat2", + "cat3", + "cat4", + "cat5", ] static let images:[UIImage] = Self.imageNames.compactMap { UIImage(named: $0)! } diff --git a/Example/Demo/ExampleListViewController.swift b/Example/Demo/ExampleListViewController.swift index bc312d1f..f39dfc42 100644 --- a/Example/Demo/ExampleListViewController.swift +++ b/Example/Demo/ExampleListViewController.swift @@ -38,6 +38,11 @@ class ExampleListViewController:UITableViewController { var items:[ExampleType] = ExampleType.allCases + override func viewDidLoad() { + super.viewDidLoad() + title = "ImageViewer.swift" + } + override func numberOfSections(in tableView: UITableView) -> Int { return 1 } diff --git a/Example/Demo/WithURLsViewController.swift b/Example/Demo/WithURLsViewController.swift index ad6d1a99..e6c06adc 100644 --- a/Example/Demo/WithURLsViewController.swift +++ b/Example/Demo/WithURLsViewController.swift @@ -92,8 +92,18 @@ extension WithURLsViewController:UICollectionViewDataSource { // Setup Image Viewer with [URL] cell.imageView.setupImageViewer( urls: Data.imageUrls, - initialIndex: indexPath.item) + initialIndex: indexPath.item, + options: [ + .theme(.dark), + .rightNavItemTitle("Info", delegate: self) + ]) return cell } } + +extension WithURLsViewController:RightNavItemDelegate { + func imageViewer(_ imageViewer: ImageCarouselViewController, didTapRightNavItem index: Int) { + print("TAPPED", index) + } +} From 441e98223756123abaa3ed69bf70cc1ec6daa152 Mon Sep 17 00:00:00 2001 From: Michael Henry Pantaleon Date: Fri, 6 Dec 2019 09:13:38 +0900 Subject: [PATCH 5/8] fixed crash --- Sources/ImageCarouselViewController.swift | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Sources/ImageCarouselViewController.swift b/Sources/ImageCarouselViewController.swift index afaf9e8e..b5799247 100644 --- a/Sources/ImageCarouselViewController.swift +++ b/Sources/ImageCarouselViewController.swift @@ -44,7 +44,7 @@ public class ImageCarouselViewController:UIPageViewController { title: NSLocalizedString("Close", comment: "Close button title"), style: .plain, target: self, - action: #selector(dismissMe)) + action: #selector(dismiss(_:))) navItem.leftBarButtonItem = closeBarButton navItem.leftBarButtonItem?.tintColor = theme.tintColor @@ -116,6 +116,10 @@ public class ImageCarouselViewController:UIPageViewController { } @objc + private func dismiss(_ sender:UIBarButtonItem) { + dismissMe(completion: nil) + } + public func dismissMe(completion: (() -> Void)? = nil) { sourceView.alpha = 1.0 UIView.animate(withDuration: 0.235, animations: { From 47721f3b226b903a8f39bded03eb9564625ff77c Mon Sep 17 00:00:00 2001 From: Michael Henry Pantaleon Date: Fri, 6 Dec 2019 09:38:39 +0900 Subject: [PATCH 6/8] add page separation space --- Sources/UIImageView_Extensions.swift | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Sources/UIImageView_Extensions.swift b/Sources/UIImageView_Extensions.swift index 7c477814..9dd4c7a7 100644 --- a/Sources/UIImageView_Extensions.swift +++ b/Sources/UIImageView_Extensions.swift @@ -109,10 +109,14 @@ extension UIImageView { @objc 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: nil) + options: options) + imageCarousel.sourceView = sourceView imageCarousel.imageDatasource = sender.imageDatasource imageCarousel.initialIndex = sender.initialIndex From 52365cd2e96c2960de369971227d1f7b7a074e61 Mon Sep 17 00:00:00 2001 From: Michael Henry Pantaleon Date: Fri, 6 Dec 2019 09:38:54 +0900 Subject: [PATCH 7/8] bugfix on resizing --- Sources/ImageViewerController.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/Sources/ImageViewerController.swift b/Sources/ImageViewerController.swift index 6105c2e9..e269198a 100644 --- a/Sources/ImageViewerController.swift +++ b/Sources/ImageViewerController.swift @@ -116,6 +116,7 @@ class ImageViewerController:UIViewController, UIGestureRecognizerDelegate { override func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() + updateConstraintsForSize(view.bounds.size) updateMinMaxZoomScaleForSize(view.bounds.size) } From d72a95c5c34e3f4bb82b42abe926ec8565227bc4 Mon Sep 17 00:00:00 2001 From: Michael Henry Pantaleon Date: Fri, 6 Dec 2019 09:39:11 +0900 Subject: [PATCH 8/8] update sample project --- Example/Demo/BasicViewController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Example/Demo/BasicViewController.swift b/Example/Demo/BasicViewController.swift index d9a40ffd..39f2a5ab 100644 --- a/Example/Demo/BasicViewController.swift +++ b/Example/Demo/BasicViewController.swift @@ -5,7 +5,7 @@ class BasicViewController:UIViewController { lazy var imageView:UIImageView = { let iv = UIImageView() - iv.image = Data.images[0].resize(targetSize: .thumbnail) + iv.image = Data.images[0] // Setup Image Viewer iv.setupImageViewer()