123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- //
- // ZoomGestureController.swift
- // WeScan
- //
- // Created by Bobo on 5/31/18.
- // Copyright © 2018 WeTransfer. All rights reserved.
- //
- import Foundation
- import AVFoundation
- final class ZoomGestureController {
-
- private let image: UIImage
- private let quadView: QuadrilateralView
-
- init(image: UIImage, quadView: QuadrilateralView) {
- self.image = image
- self.quadView = quadView
- }
-
- private var previousPanPosition: CGPoint?
- private var closestCorner: CornerPosition?
-
- @objc func handle(pan: UIGestureRecognizer) {
- guard let drawnQuad = quadView.quad else {
- return
- }
-
- guard pan.state != .ended else {
- self.previousPanPosition = nil
- self.closestCorner = nil
- quadView.resetHighlightedCornerViews()
- return
- }
-
- let position = pan.location(in: quadView)
-
- let previousPanPosition = self.previousPanPosition ?? position
- let closestCorner = self.closestCorner ?? position.closestCornerFrom(quad: drawnQuad)
-
- let offset = CGAffineTransform(translationX: position.x - previousPanPosition.x, y: position.y - previousPanPosition.y)
- let cornerView = quadView.cornerViewForCornerPosition(position: closestCorner)
- let draggedCornerViewCenter = cornerView.center.applying(offset)
- quadView.moveCorner(cornerView: cornerView, atPoint: draggedCornerViewCenter)
-
- self.previousPanPosition = position
- self.closestCorner = closestCorner
-
- let scale = image.size.width / quadView.bounds.size.width
- let scaledDraggedCornerViewCenter = CGPoint(x: draggedCornerViewCenter.x * scale, y: draggedCornerViewCenter.y * scale)
- guard let zoomedImage = image.scaledImage(atPoint: scaledDraggedCornerViewCenter, scaleFactor: 2.5, targetSize: quadView.bounds.size) else {
- return
- }
-
- quadView.highlightCornerAtPosition(position: closestCorner, with: zoomedImage)
- }
- }
|