From 93bab86e0913805337ab3ed4770bc1b05f98473f Mon Sep 17 00:00:00 2001 From: Rodrigo Leite Date: Mon, 28 Nov 2016 11:36:35 -0200 Subject: [PATCH 1/2] add page control to the component --- Example/Optik/ViewController.swift | 4 +- Optik/Classes/AlbumViewController.swift | 94 +++++++++++++++++++++++-- Optik/Classes/Optik.swift | 18 +++-- 3 files changed, 104 insertions(+), 12 deletions(-) diff --git a/Example/Optik/ViewController.swift b/Example/Optik/ViewController.swift index db83faf..64399d5 100644 --- a/Example/Optik/ViewController.swift +++ b/Example/Optik/ViewController.swift @@ -45,7 +45,7 @@ internal final class ViewController: UIViewController { @IBAction private func presentLocalImageViewer(_ sender: UIButton) { let viewController = Optik.imageViewer(withImages: localImages, initialImageDisplayIndex: currentLocalImageIndex, - delegate: self) + delegate: self, enablePageControl: true) present(viewController, animated: true, completion: nil) } @@ -62,7 +62,7 @@ internal final class ViewController: UIViewController { let urls = [url1, url2, url3, url4] let imageDownloader = AlamofireImageDownloader() - let viewController = Optik.imageViewer(withURLs: urls, imageDownloader: imageDownloader) + let viewController = Optik.imageViewer(withURLs: urls, imageDownloader: imageDownloader, enablePageControl: true) present(viewController, animated: true, completion: nil) } diff --git a/Optik/Classes/AlbumViewController.swift b/Optik/Classes/AlbumViewController.swift index 9d00651..89cde88 100644 --- a/Optik/Classes/AlbumViewController.swift +++ b/Optik/Classes/AlbumViewController.swift @@ -58,7 +58,7 @@ internal final class AlbumViewController: UIViewController { return viewControllers[0] as? ImageViewController } - private var imageData: ImageData + fileprivate var imageData: ImageData private var initialImageDisplayIndex: Int private var activityIndicatorColor: UIColor? private var dismissButtonImage: UIImage? @@ -69,13 +69,16 @@ internal final class AlbumViewController: UIViewController { private var transitionController: TransitionController = TransitionController() + fileprivate var pageControl: UIPageControl? + // MARK: - Init/Deinit init(imageData: ImageData, initialImageDisplayIndex: Int, activityIndicatorColor: UIColor?, dismissButtonImage: UIImage?, - dismissButtonPosition: DismissButtonPosition) { + dismissButtonPosition: DismissButtonPosition, + enablePageControl: Bool) { self.imageData = imageData self.initialImageDisplayIndex = initialImageDisplayIndex @@ -83,9 +86,16 @@ internal final class AlbumViewController: UIViewController { self.dismissButtonImage = dismissButtonImage self.dismissButtonPosition = dismissButtonPosition - pageViewController = UIPageViewController(transitionStyle: .scroll, - navigationOrientation: .horizontal, + if enablePageControl { + pageViewController = UIPageViewController(transitionStyle: .scroll, + navigationOrientation: .vertical, options: [UIPageViewControllerOptionInterPageSpacingKey : Constants.SpacingBetweenImages]) + pageControl = UIPageControl() + } else { + pageViewController = UIPageViewController(transitionStyle: .scroll, + navigationOrientation: .horizontal, + options: [UIPageViewControllerOptionInterPageSpacingKey : Constants.SpacingBetweenImages]) + } super.init(nibName: nil, bundle: nil) @@ -147,6 +157,7 @@ internal final class AlbumViewController: UIViewController { didMove(toParentViewController: pageViewController) setupDismissButton() + setupPageControl() setupPanGestureRecognizer() } @@ -163,6 +174,56 @@ internal final class AlbumViewController: UIViewController { } } + private func setupPageControl() { + + if let page = pageControl { + page.currentPage = 0 + page.pageIndicatorTintColor = UIColor.red + page.translatesAutoresizingMaskIntoConstraints = false + page.transform = CGAffineTransform(rotationAngle: CGFloat(M_PI/2)) + view.addSubview(page) + + view.addConstraint( + NSLayoutConstraint(item: page, + attribute: .trailing, + relatedBy: .equal, + toItem: view, + attribute: .trailing, + multiplier: 1, + constant: -10) + ) + view.addConstraint( + NSLayoutConstraint(item: page, + attribute: .centerY, + relatedBy: .equal, + toItem: view, + attribute: .centerY, + multiplier: 1, + constant: 0) + ) + view.addConstraint( + NSLayoutConstraint(item: page, + attribute: .width, + relatedBy: .equal, + toItem: nil, + attribute: .notAnAttribute, + multiplier: 1, + constant: 30) + ) + view.addConstraint( + NSLayoutConstraint(item: page, + attribute: .height, + relatedBy: .equal, + toItem: nil, + attribute: .notAnAttribute, + multiplier: 1, + constant: 25) + ) + } + + } + + private func setupDismissButton() { let dismissButton = UIButton(type: .custom) dismissButton.translatesAutoresizingMaskIntoConstraints = false @@ -226,12 +287,14 @@ internal final class AlbumViewController: UIViewController { return nil } + pageControl?.numberOfPages = images.count return ImageViewController(image: images[index], index: index) case .remote(let urls, let imageDownloader): guard index >= 0 && index < urls.count else { return nil } + pageControl?.numberOfPages = urls.count let imageViewController = ImageViewController(activityIndicatorColor: activityIndicatorColor, index: index) let url = urls[index] @@ -245,6 +308,7 @@ internal final class AlbumViewController: UIViewController { imageViewController.image = image }) } + return imageViewController } @@ -306,6 +370,28 @@ extension AlbumViewController: UIPageViewControllerDelegate { if let currentImageIndex = currentImageViewController?.index { imageViewerDelegate?.imageViewerDidDisplayImage(at: currentImageIndex) + pageControl?.currentPage = currentImageIndex + } + } + + func pageViewController(pageViewController: UIPageViewController, spineLocationForInterfaceOrientation orientation: UIInterfaceOrientation) -> UIPageViewControllerSpineLocation { + return .max + } + + func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int { + return numberOfImages() + } + + func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int { + return currentImageViewController?.index ?? 0 + } + + private func numberOfImages() -> Int { + switch imageData { + case .local(images: let images): + return images.count + case .remote(urls: let urls, imageDownloader: _): + return urls.count } } diff --git a/Optik/Classes/Optik.swift b/Optik/Classes/Optik.swift index fc54d43..f0d8c0b 100644 --- a/Optik/Classes/Optik.swift +++ b/Optik/Classes/Optik.swift @@ -25,11 +25,13 @@ public func imageViewer(withImages images: [UIImage], initialImageDisplayIndex: Int = 0, delegate: ImageViewerDelegate? = nil, dismissButtonImage: UIImage? = nil, - dismissButtonPosition: DismissButtonPosition = .topLeading) -> UIViewController { + dismissButtonPosition: DismissButtonPosition = .topLeading, + enablePageControl: Bool) -> UIViewController { let albumViewController = imageViewer(withData: .local(images: images), initialImageDisplayIndex: initialImageDisplayIndex, dismissButtonImage: dismissButtonImage, - dismissButtonPosition: dismissButtonPosition) + dismissButtonPosition: dismissButtonPosition, + enablePageControl: enablePageControl) albumViewController.modalPresentationStyle = .custom albumViewController.imageViewerDelegate = delegate @@ -53,12 +55,14 @@ public func imageViewer(withURLs urls: [URL], imageDownloader: ImageDownloader, activityIndicatorColor: UIColor = .white, dismissButtonImage: UIImage? = nil, - dismissButtonPosition: DismissButtonPosition = .topLeading) -> UIViewController { + dismissButtonPosition: DismissButtonPosition = .topLeading, + enablePageControl: Bool) -> UIViewController { return imageViewer(withData: .remote(urls: urls, imageDownloader: imageDownloader), initialImageDisplayIndex: initialImageDisplayIndex, activityIndicatorColor: activityIndicatorColor, dismissButtonImage: dismissButtonImage, - dismissButtonPosition: dismissButtonPosition) + dismissButtonPosition: dismissButtonPosition, + enablePageControl: enablePageControl) } // MARK: - Private functions @@ -67,7 +71,8 @@ private func imageViewer(withData imageData: ImageData, initialImageDisplayIndex: Int, activityIndicatorColor: UIColor? = nil, dismissButtonImage: UIImage?, - dismissButtonPosition: DismissButtonPosition) -> AlbumViewController { + dismissButtonPosition: DismissButtonPosition, + enablePageControl: Bool) -> AlbumViewController { let bundle = Bundle(for: AlbumViewController.self) let defaultDismissButtonImage = UIImage(named: "DismissIcon", in: bundle, compatibleWith: nil) @@ -75,5 +80,6 @@ private func imageViewer(withData imageData: ImageData, initialImageDisplayIndex: initialImageDisplayIndex, activityIndicatorColor: activityIndicatorColor, dismissButtonImage: dismissButtonImage ?? defaultDismissButtonImage, - dismissButtonPosition: dismissButtonPosition) + dismissButtonPosition: dismissButtonPosition, + enablePageControl: enablePageControl) } From 9e914a53ca7d0821024ea883678720192e2bae35 Mon Sep 17 00:00:00 2001 From: Rodrigo Leite Date: Wed, 30 Nov 2016 20:46:23 -0200 Subject: [PATCH 2/2] - pageControl currentIndex --- Optik/Classes/AlbumViewController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Optik/Classes/AlbumViewController.swift b/Optik/Classes/AlbumViewController.swift index 89cde88..35c9c57 100644 --- a/Optik/Classes/AlbumViewController.swift +++ b/Optik/Classes/AlbumViewController.swift @@ -177,7 +177,7 @@ internal final class AlbumViewController: UIViewController { private func setupPageControl() { if let page = pageControl { - page.currentPage = 0 + page.currentPage = initialImageDisplayIndex page.pageIndicatorTintColor = UIColor.red page.translatesAutoresizingMaskIntoConstraints = false page.transform = CGAffineTransform(rotationAngle: CGFloat(M_PI/2))