NCViewerImagePageContainer.swift 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. import UIKit
  2. protocol NCViewerImagePageContainerDelegate: class {
  3. func containerViewController(_ containerViewController: NCViewerImagePageContainer, indexDidUpdate currentIndex: Int)
  4. }
  5. class NCViewerImagePageContainer: UIViewController, UIGestureRecognizerDelegate {
  6. enum ScreenMode {
  7. case full, normal
  8. }
  9. var currentMode: ScreenMode = .normal
  10. weak var delegate: NCViewerImagePageContainerDelegate?
  11. var pageViewController: UIPageViewController {
  12. return self.children[0] as! UIPageViewController
  13. }
  14. var currentViewController: NCViewerImageZoom {
  15. return self.pageViewController.viewControllers![0] as! NCViewerImageZoom
  16. }
  17. var metadatas: [tableMetadata] = []
  18. var currentIndex = 0
  19. var nextIndex: Int?
  20. var panGestureRecognizer: UIPanGestureRecognizer!
  21. var singleTapGestureRecognizer: UITapGestureRecognizer!
  22. var transitionController = ZoomTransitionController()
  23. override func viewDidLoad() {
  24. super.viewDidLoad()
  25. pageViewController.delegate = self
  26. pageViewController.dataSource = self
  27. panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(didPanWith(gestureRecognizer:)))
  28. panGestureRecognizer.delegate = self
  29. pageViewController.view.addGestureRecognizer(self.panGestureRecognizer)
  30. singleTapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(didSingleTapWith(gestureRecognizer:)))
  31. pageViewController.view.addGestureRecognizer(self.singleTapGestureRecognizer)
  32. let viewerImageZoom = UIStoryboard(name: "NCViewerImage", bundle: nil).instantiateViewController(withIdentifier: "NCViewerImageZoom") as! NCViewerImageZoom
  33. viewerImageZoom.delegate = self
  34. viewerImageZoom.index = currentIndex
  35. viewerImageZoom.image = getImageFromMetadata(metadatas[currentIndex])
  36. singleTapGestureRecognizer.require(toFail: viewerImageZoom.doubleTapGestureRecognizer)
  37. pageViewController.setViewControllers([viewerImageZoom], direction: .forward, animated: true, completion: nil)
  38. }
  39. func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
  40. if let gestureRecognizer = gestureRecognizer as? UIPanGestureRecognizer {
  41. let velocity = gestureRecognizer.velocity(in: self.view)
  42. var velocityCheck : Bool = false
  43. if UIDevice.current.orientation.isLandscape {
  44. velocityCheck = velocity.x < 0
  45. }
  46. else {
  47. velocityCheck = velocity.y < 0
  48. }
  49. if velocityCheck {
  50. return false
  51. }
  52. }
  53. return true
  54. }
  55. func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
  56. if otherGestureRecognizer == currentViewController.scrollView.panGestureRecognizer {
  57. if self.currentViewController.scrollView.contentOffset.y == 0 {
  58. return true
  59. }
  60. }
  61. return false
  62. }
  63. @objc func didPanWith(gestureRecognizer: UIPanGestureRecognizer) {
  64. switch gestureRecognizer.state {
  65. case .began:
  66. currentViewController.scrollView.isScrollEnabled = false
  67. transitionController.isInteractive = true
  68. navigationController?.popViewController(animated: true)
  69. case .ended:
  70. if transitionController.isInteractive {
  71. currentViewController.scrollView.isScrollEnabled = true
  72. transitionController.isInteractive = false
  73. transitionController.didPanWith(gestureRecognizer: gestureRecognizer)
  74. }
  75. default:
  76. if transitionController.isInteractive {
  77. transitionController.didPanWith(gestureRecognizer: gestureRecognizer)
  78. }
  79. }
  80. }
  81. @objc func didSingleTapWith(gestureRecognizer: UITapGestureRecognizer) {
  82. if self.currentMode == .full {
  83. changeScreenMode(to: .normal)
  84. self.currentMode = .normal
  85. } else {
  86. changeScreenMode(to: .full)
  87. self.currentMode = .full
  88. }
  89. }
  90. func changeScreenMode(to: ScreenMode) {
  91. if to == .full {
  92. navigationController?.setNavigationBarHidden(true, animated: false)
  93. UIView.animate(withDuration: 0.25,
  94. animations: {
  95. self.view.backgroundColor = .black
  96. }, completion: { completed in
  97. })
  98. } else {
  99. navigationController?.setNavigationBarHidden(false, animated: false)
  100. UIView.animate(withDuration: 0.25,
  101. animations: {
  102. if #available(iOS 13.0, *) {
  103. self.view.backgroundColor = .systemBackground
  104. } else {
  105. self.view.backgroundColor = .white
  106. }
  107. }, completion: { completed in
  108. })
  109. }
  110. }
  111. func getImageFromMetadata(_ metadata: tableMetadata) -> UIImage {
  112. if FileManager().fileExists(atPath: CCUtility.getDirectoryProviderStorageIconOcId(metadata.ocId, etag: metadata.etag)) {
  113. return UIImage(contentsOfFile: CCUtility.getDirectoryProviderStorageIconOcId(metadata.ocId, etag: metadata.etag))!
  114. } else {
  115. return NCCollectionCommon.images.cellFileImage
  116. }
  117. }
  118. }
  119. extension NCViewerImagePageContainer: UIPageViewControllerDelegate, UIPageViewControllerDataSource {
  120. func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
  121. if currentIndex == 0 {
  122. return nil
  123. }
  124. let viewerImageZoom = UIStoryboard(name: "NCViewerImage", bundle: nil).instantiateViewController(withIdentifier: "NCViewerImageZoom") as! NCViewerImageZoom
  125. viewerImageZoom.delegate = self
  126. viewerImageZoom.image = getImageFromMetadata(metadatas[currentIndex - 1])
  127. viewerImageZoom.index = currentIndex - 1
  128. self.singleTapGestureRecognizer.require(toFail: viewerImageZoom.doubleTapGestureRecognizer)
  129. return viewerImageZoom
  130. }
  131. func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
  132. if currentIndex == (self.metadatas.count - 1) {
  133. return nil
  134. }
  135. let viewerImageZoom = UIStoryboard(name: "NCViewerImage", bundle: nil).instantiateViewController(withIdentifier: "NCViewerImageZoom") as! NCViewerImageZoom
  136. viewerImageZoom.delegate = self
  137. singleTapGestureRecognizer.require(toFail: viewerImageZoom.doubleTapGestureRecognizer)
  138. viewerImageZoom.image = getImageFromMetadata(metadatas[currentIndex + 1])
  139. viewerImageZoom.index = currentIndex + 1
  140. return viewerImageZoom
  141. }
  142. func pageViewController(_ pageViewController: UIPageViewController, willTransitionTo pendingViewControllers: [UIViewController]) {
  143. guard let nextVC = pendingViewControllers.first as? NCViewerImageZoom else {
  144. return
  145. }
  146. self.nextIndex = nextVC.index
  147. }
  148. func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
  149. if (completed && self.nextIndex != nil) {
  150. previousViewControllers.forEach { vc in
  151. let viewerImageZoom = vc as! NCViewerImageZoom
  152. viewerImageZoom.scrollView.zoomScale = viewerImageZoom.scrollView.minimumZoomScale
  153. }
  154. currentIndex = nextIndex!
  155. delegate?.containerViewController(self, indexDidUpdate: currentIndex)
  156. }
  157. self.nextIndex = nil
  158. }
  159. }
  160. extension NCViewerImagePageContainer: NCViewerImageZoomDelegate {
  161. func viewerImageZoom(_ viewerImageZoom: NCViewerImageZoom, scrollViewDidScroll scrollView: UIScrollView) {
  162. if scrollView.zoomScale != scrollView.minimumZoomScale && currentMode != .full {
  163. changeScreenMode(to: .full)
  164. currentMode = .full
  165. }
  166. }
  167. }
  168. extension NCViewerImagePageContainer: ZoomAnimatorDelegate {
  169. func transitionWillStartWith(zoomAnimator: ZoomAnimator) {
  170. }
  171. func transitionDidEndWith(zoomAnimator: ZoomAnimator) {
  172. }
  173. func referenceImageView(for zoomAnimator: ZoomAnimator) -> UIImageView? {
  174. return self.currentViewController.imageView
  175. }
  176. func referenceImageViewFrameInTransitioningView(for zoomAnimator: ZoomAnimator) -> CGRect? {
  177. return currentViewController.scrollView.convert(currentViewController.imageView.frame, to: currentViewController.view)
  178. }
  179. }