ZoomGestureController.swift 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. //
  2. // ZoomGestureController.swift
  3. // WeScan
  4. //
  5. // Created by Bobo on 5/31/18.
  6. // Copyright © 2018 WeTransfer. All rights reserved.
  7. //
  8. import Foundation
  9. import AVFoundation
  10. final class ZoomGestureController {
  11. private let image: UIImage
  12. private let quadView: QuadrilateralView
  13. init(image: UIImage, quadView: QuadrilateralView) {
  14. self.image = image
  15. self.quadView = quadView
  16. }
  17. private var previousPanPosition: CGPoint?
  18. private var closestCorner: CornerPosition?
  19. @objc func handle(pan: UIGestureRecognizer) {
  20. guard let drawnQuad = quadView.quad else {
  21. return
  22. }
  23. guard pan.state != .ended else {
  24. self.previousPanPosition = nil
  25. self.closestCorner = nil
  26. quadView.resetHighlightedCornerViews()
  27. return
  28. }
  29. let position = pan.location(in: quadView)
  30. let previousPanPosition = self.previousPanPosition ?? position
  31. let closestCorner = self.closestCorner ?? position.closestCornerFrom(quad: drawnQuad)
  32. let offset = CGAffineTransform(translationX: position.x - previousPanPosition.x, y: position.y - previousPanPosition.y)
  33. let cornerView = quadView.cornerViewForCornerPosition(position: closestCorner)
  34. let draggedCornerViewCenter = cornerView.center.applying(offset)
  35. quadView.moveCorner(cornerView: cornerView, atPoint: draggedCornerViewCenter)
  36. self.previousPanPosition = position
  37. self.closestCorner = closestCorner
  38. let scale = image.size.width / quadView.bounds.size.width
  39. let scaledDraggedCornerViewCenter = CGPoint(x: draggedCornerViewCenter.x * scale, y: draggedCornerViewCenter.y * scale)
  40. guard let zoomedImage = image.scaledImage(atPoint: scaledDraggedCornerViewCenter, scaleFactor: 2.5, targetSize: quadView.bounds.size) else {
  41. return
  42. }
  43. quadView.highlightCornerAtPosition(position: closestCorner, with: zoomedImage)
  44. }
  45. }