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() 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) + } +} diff --git a/Sources/ImageCarouselViewController.swift b/Sources/ImageCarouselViewController.swift index fb6f58cd..b5799247 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 @@ -61,15 +63,29 @@ class ImageCarouselViewController:UIPageViewController { options.forEach { switch $0 { - case .theme(let theme): - self.theme = theme - case .closeIcon(let icon): - navItem.leftBarButtonItem?.image = icon + 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 } } } - override func viewDidLoad() { + override public func viewDidLoad() { super.viewDidLoad() addBackgroundView() @@ -92,7 +108,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,16 +116,28 @@ class ImageCarouselViewController:UIPageViewController { } @objc - func dismiss(_ sender:UIBarButtonItem?) { + private func dismiss(_ sender:UIBarButtonItem) { + dismissMe(completion: nil) + } + + 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) } } - 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 +146,7 @@ class ImageCarouselViewController:UIPageViewController { } extension ImageCarouselViewController:UIPageViewControllerDataSource { - func pageViewController( + public func pageViewController( _ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? { @@ -135,7 +163,7 @@ extension ImageCarouselViewController:UIPageViewControllerDataSource { delegate: self) } - func pageViewController( + public func pageViewController( _ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? { 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) } diff --git a/Sources/ImageViewerOption.swift b/Sources/ImageViewerOption.swift index 0504ba7f..142e0993 100644 --- a/Sources/ImageViewerOption.swift +++ b/Sources/ImageViewerOption.swift @@ -4,4 +4,6 @@ public enum ImageViewerOption { case theme(ImageViewerTheme) case closeIcon(UIImage) + case rightNavItemTitle(String, delegate: RightNavItemDelegate?) + case rightNavItemIcon(UIImage, 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) +} 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