123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239 |
- import UIKit
- protocol NCViewerImagePageContainerDelegate: class {
- func containerViewController(_ containerViewController: NCViewerImagePageContainer, indexDidUpdate currentIndex: Int)
- }
- class NCViewerImagePageContainer: UIViewController, UIGestureRecognizerDelegate {
- enum ScreenMode {
- case full, normal
- }
- var currentMode: ScreenMode = .normal
-
- weak var delegate: NCViewerImagePageContainerDelegate?
-
- var pageViewController: UIPageViewController {
- return self.children[0] as! UIPageViewController
- }
-
- var currentViewController: NCViewerImageZoom {
- return self.pageViewController.viewControllers![0] as! NCViewerImageZoom
- }
-
- var metadatas: [tableMetadata] = []
- var currentIndex = 0
- var nextIndex: Int?
-
- var panGestureRecognizer: UIPanGestureRecognizer!
- var singleTapGestureRecognizer: UITapGestureRecognizer!
-
- var transitionController = ZoomTransitionController()
-
- override func viewDidLoad() {
- super.viewDidLoad()
-
- self.pageViewController.delegate = self
- self.pageViewController.dataSource = self
- self.panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(didPanWith(gestureRecognizer:)))
- self.panGestureRecognizer.delegate = self
- self.pageViewController.view.addGestureRecognizer(self.panGestureRecognizer)
-
- self.singleTapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(didSingleTapWith(gestureRecognizer:)))
- self.pageViewController.view.addGestureRecognizer(self.singleTapGestureRecognizer)
-
- let vc = UIStoryboard(name: "NCViewerImage", bundle: nil).instantiateViewController(withIdentifier: "\(NCViewerImageZoom.self)") as! NCViewerImageZoom
- vc.delegate = self
- vc.index = self.currentIndex
- vc.image = getImageFromMetadata(metadatas[currentIndex])
- self.singleTapGestureRecognizer.require(toFail: vc.doubleTapGestureRecognizer)
- let viewControllers = [vc]
-
- self.pageViewController.setViewControllers(viewControllers, direction: .forward, animated: true, completion: nil)
- }
-
- func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
-
- if let gestureRecognizer = gestureRecognizer as? UIPanGestureRecognizer {
- let velocity = gestureRecognizer.velocity(in: self.view)
-
- var velocityCheck : Bool = false
-
- if UIDevice.current.orientation.isLandscape {
- velocityCheck = velocity.x < 0
- }
- else {
- velocityCheck = velocity.y < 0
- }
- if velocityCheck {
- return false
- }
- }
-
- return true
- }
-
- func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
-
- if otherGestureRecognizer == self.currentViewController.scrollView.panGestureRecognizer {
- if self.currentViewController.scrollView.contentOffset.y == 0 {
- return true
- }
- }
-
- return false
- }
-
- override func didReceiveMemoryWarning() {
- super.didReceiveMemoryWarning()
- // Dispose of any resources that can be recreated.
- }
-
- @objc func didPanWith(gestureRecognizer: UIPanGestureRecognizer) {
- switch gestureRecognizer.state {
- case .began:
- self.currentViewController.scrollView.isScrollEnabled = false
- self.transitionController.isInteractive = true
- let _ = self.navigationController?.popViewController(animated: true)
- case .ended:
- if self.transitionController.isInteractive {
- self.currentViewController.scrollView.isScrollEnabled = true
- self.transitionController.isInteractive = false
- self.transitionController.didPanWith(gestureRecognizer: gestureRecognizer)
- }
- default:
- if self.transitionController.isInteractive {
- self.transitionController.didPanWith(gestureRecognizer: gestureRecognizer)
- }
- }
- }
-
- @objc func didSingleTapWith(gestureRecognizer: UITapGestureRecognizer) {
- if self.currentMode == .full {
- changeScreenMode(to: .normal)
- self.currentMode = .normal
- } else {
- changeScreenMode(to: .full)
- self.currentMode = .full
- }
- }
-
- func changeScreenMode(to: ScreenMode) {
- if to == .full {
- self.navigationController?.setNavigationBarHidden(true, animated: false)
- UIView.animate(withDuration: 0.25,
- animations: {
- self.view.backgroundColor = .black
-
- }, completion: { completed in
- })
- } else {
- self.navigationController?.setNavigationBarHidden(false, animated: false)
- UIView.animate(withDuration: 0.25,
- animations: {
- if #available(iOS 13.0, *) {
- self.view.backgroundColor = .systemBackground
- } else {
- self.view.backgroundColor = .white
- }
- }, completion: { completed in
- })
- }
- }
-
- func getImageFromMetadata(_ metadata: tableMetadata) -> UIImage {
- if FileManager().fileExists(atPath: CCUtility.getDirectoryProviderStorageIconOcId(metadata.ocId, etag: metadata.etag)) {
- return UIImage(contentsOfFile: CCUtility.getDirectoryProviderStorageIconOcId(metadata.ocId, etag: metadata.etag))!
- } else {
- return NCCollectionCommon.images.cellFileImage
- }
- }
- }
- extension NCViewerImagePageContainer: UIPageViewControllerDelegate, UIPageViewControllerDataSource {
-
- func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
-
- if currentIndex == 0 {
- return nil
- }
-
- let vc = UIStoryboard(name: "NCViewerImage", bundle: nil).instantiateViewController(withIdentifier: "\(NCViewerImageZoom.self)") as! NCViewerImageZoom
- vc.delegate = self
- vc.image = getImageFromMetadata(metadatas[currentIndex - 1])
- vc.index = currentIndex - 1
- self.singleTapGestureRecognizer.require(toFail: vc.doubleTapGestureRecognizer)
- return vc
-
- }
-
- func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
-
- if currentIndex == (self.metadatas.count - 1) {
- return nil
- }
-
- let vc = UIStoryboard(name: "NCViewerImage", bundle: nil).instantiateViewController(withIdentifier: "\(NCViewerImageZoom.self)") as! NCViewerImageZoom
- vc.delegate = self
- self.singleTapGestureRecognizer.require(toFail: vc.doubleTapGestureRecognizer)
- vc.image = getImageFromMetadata(metadatas[currentIndex + 1])
- vc.index = currentIndex + 1
- return vc
-
- }
-
- func pageViewController(_ pageViewController: UIPageViewController, willTransitionTo pendingViewControllers: [UIViewController]) {
-
- guard let nextVC = pendingViewControllers.first as? NCViewerImageZoom else {
- return
- }
-
- self.nextIndex = nextVC.index
- }
-
- func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
-
- if (completed && self.nextIndex != nil) {
- previousViewControllers.forEach { vc in
- let zoomVC = vc as! NCViewerImageZoom
- zoomVC.scrollView.zoomScale = zoomVC.scrollView.minimumZoomScale
- }
- self.currentIndex = self.nextIndex!
- self.delegate?.containerViewController(self, indexDidUpdate: self.currentIndex)
- }
-
- self.nextIndex = nil
- }
-
- }
- extension NCViewerImagePageContainer: NCViewerImageZoomDelegate {
-
- func viewerImageZoom(_ viewerImageZoom: NCViewerImageZoom, scrollViewDidScroll scrollView: UIScrollView) {
- if scrollView.zoomScale != scrollView.minimumZoomScale && self.currentMode != .full {
- self.changeScreenMode(to: .full)
- self.currentMode = .full
- }
- }
- }
- extension NCViewerImagePageContainer: ZoomAnimatorDelegate {
-
- func transitionWillStartWith(zoomAnimator: ZoomAnimator) {
- }
-
- func transitionDidEndWith(zoomAnimator: ZoomAnimator) {
- }
-
- func referenceImageView(for zoomAnimator: ZoomAnimator) -> UIImageView? {
- return self.currentViewController.imageView
- }
-
- func referenceImageViewFrameInTransitioningView(for zoomAnimator: ZoomAnimator) -> CGRect? {
- return self.currentViewController.scrollView.convert(self.currentViewController.imageView.frame, to: self.currentViewController.view)
- }
- }
|