NCViewerImageZoom.swift 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. import UIKit
  2. protocol NCViewerImageZoomDelegate: class {
  3. func viewerImageZoom(_ viewerImageZoom: NCViewerImageZoom, scrollViewDidScroll scrollView: UIScrollView)
  4. }
  5. class NCViewerImageZoom: UIViewController {
  6. @IBOutlet weak var imageViewBottomConstraint: NSLayoutConstraint!
  7. @IBOutlet weak var imageViewLeadingConstraint: NSLayoutConstraint!
  8. @IBOutlet weak var imageViewTopConstraint: NSLayoutConstraint!
  9. @IBOutlet weak var imageViewTrailingConstraint: NSLayoutConstraint!
  10. @IBOutlet weak var scrollView: UIScrollView!
  11. @IBOutlet weak var imageView: UIImageView!
  12. @IBOutlet weak var statusViewImage: UIImageView!
  13. weak var delegate: NCViewerImageZoomDelegate?
  14. var image: UIImage!
  15. var metadata: tableMetadata = tableMetadata()
  16. var index: Int = 0
  17. var doubleTapGestureRecognizer: UITapGestureRecognizer!
  18. required init?(coder aDecoder: NSCoder) {
  19. super.init(coder: aDecoder)
  20. self.doubleTapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(didDoubleTapWith(gestureRecognizer:)))
  21. self.doubleTapGestureRecognizer.numberOfTapsRequired = 2
  22. }
  23. override func viewDidLoad() {
  24. super.viewDidLoad()
  25. self.scrollView.delegate = self
  26. self.scrollView.contentInsetAdjustmentBehavior = .never
  27. self.imageView.image = self.image
  28. self.imageView.frame = CGRect(x: self.imageView.frame.origin.x, y: self.imageView.frame.origin.y, width: self.image.size.width, height: self.image.size.height)
  29. self.view.addGestureRecognizer(self.doubleTapGestureRecognizer)
  30. }
  31. override func viewDidLayoutSubviews() {
  32. super.viewDidLayoutSubviews()
  33. updateZoomScaleForSize(view.bounds.size)
  34. updateConstraintsForSize(view.bounds.size)
  35. }
  36. override func viewWillAppear(_ animated: Bool) {
  37. super.viewWillAppear(animated)
  38. navigationItem.title = metadata.fileNameView
  39. }
  40. override func viewDidAppear(_ animated: Bool) {
  41. super.viewDidAppear(animated)
  42. updateZoomScaleForSize(view.bounds.size)
  43. updateConstraintsForSize(view.bounds.size)
  44. }
  45. override func didReceiveMemoryWarning() {
  46. super.didReceiveMemoryWarning()
  47. }
  48. @objc func didDoubleTapWith(gestureRecognizer: UITapGestureRecognizer) {
  49. let pointInView = gestureRecognizer.location(in: self.imageView)
  50. var newZoomScale = self.scrollView.maximumZoomScale
  51. if self.scrollView.zoomScale >= newZoomScale || abs(self.scrollView.zoomScale - newZoomScale) <= 0.01 {
  52. newZoomScale = self.scrollView.minimumZoomScale
  53. }
  54. let width = self.scrollView.bounds.width / newZoomScale
  55. let height = self.scrollView.bounds.height / newZoomScale
  56. let originX = pointInView.x - (width / 2.0)
  57. let originY = pointInView.y - (height / 2.0)
  58. let rectToZoomTo = CGRect(x: originX, y: originY, width: width, height: height)
  59. self.scrollView.zoom(to: rectToZoomTo, animated: true)
  60. }
  61. fileprivate func updateZoomScaleForSize(_ size: CGSize) {
  62. let widthScale = size.width / imageView.bounds.width
  63. let heightScale = size.height / imageView.bounds.height
  64. let minScale = min(widthScale, heightScale)
  65. scrollView.minimumZoomScale = minScale
  66. scrollView.zoomScale = minScale
  67. scrollView.maximumZoomScale = minScale * 4
  68. }
  69. fileprivate func updateConstraintsForSize(_ size: CGSize) {
  70. let yOffset = max(0, (size.height - imageView.frame.height) / 2)
  71. imageViewTopConstraint.constant = yOffset
  72. imageViewBottomConstraint.constant = yOffset
  73. let xOffset = max(0, (size.width - imageView.frame.width) / 2)
  74. imageViewLeadingConstraint.constant = xOffset
  75. imageViewTrailingConstraint.constant = xOffset
  76. let contentHeight = yOffset * 2 + self.imageView.frame.height
  77. view.layoutIfNeeded()
  78. self.scrollView.contentSize = CGSize(width: self.scrollView.contentSize.width, height: contentHeight)
  79. }
  80. }
  81. extension NCViewerImageZoom: UIScrollViewDelegate {
  82. func viewForZooming(in scrollView: UIScrollView) -> UIView? {
  83. return imageView
  84. }
  85. func scrollViewDidZoom(_ scrollView: UIScrollView) {
  86. updateConstraintsForSize(self.view.bounds.size)
  87. }
  88. func scrollViewDidScroll(_ scrollView: UIScrollView) {
  89. self.delegate?.viewerImageZoom(self, scrollViewDidScroll: scrollView)
  90. }
  91. }