簡體   English   中英

UIImageView 上的捏合、平移和雙擊手勢

[英]Pinch, Pan and Double tap gesture on UIImageView

我想在具有以下限制的圖像視圖上應用這些手勢:

1)雙擊:放大圖像兩次,然后恢復到原始大小

2)捏:縮放圖像與原始大小的最大限制和最小限制

3)平移:當圖像被放大移動圖像和圖像視圖不應超過邊界之一平移

我已經使用教程嘗試了以下代碼,但 pan 無法正常工作,我認為這有時也會影響其他手勢:

請讓我知道我做錯了什么。

特性:

var originalFrame = CGRect()
var initialCenter = CGPoint()  // The initial center point of the view.
var imgTapCount = 0
var lastScale: CGFloat = 1.0
var minScale = 1.0
var maxScale = 4.0
var imageCurrentScale = 1.0

viewDidLoad()我調用以下函數

func displayImage() {
   //imgView gets image assigned here from Url
    originalFrame = imgView.frame
}

點擊手勢:

@IBAction func imgTapGesture(_ sender: UITapGestureRecognizer) {
        guard sender.view != nil else {return}
        if imgTapCount < 2 {
            let pinchCenter = CGPoint(x: sender.location(in: view).x - view.bounds.midX,
                                      y: sender.location(in: view).y - view.bounds.midY)
            let transform = sender.view?.transform.translatedBy(x: pinchCenter.x, y: pinchCenter.y)
                .scaledBy(x: 2, y: 2)
                .translatedBy(x: -pinchCenter.x, y: -pinchCenter.y)
            sender.view?.transform = transform!
        } else {
            UIView.animate(withDuration: 0.2, animations: {
                sender.view?.transform = CGAffineTransform.identity
            })
        }
        if imgTapCount < 2 {
            imgTapCount += 1
        } else {
            imgTapCount = 0
        }
    }

平移手勢

@IBAction func imgPanGesture(_ sender: UIPanGestureRecognizer) {
    guard sender.view != nil else {return}
    let piece = sender.view!
    // Get the changes in the X and Y directions relative to
    // the superview's coordinate space.
    let translation = sender.translation(in: piece.superview)
    if sender.state == .began {
        // Save the view's original position.
        self.initialCenter = piece.center
    }
    // Update the position for the .began, .changed, and .ended states
    if sender.state != .cancelled {
        // Add the X and Y translation to the view's original position.
       
        if (imgView.frame.width > piece.superview!.frame.width || imgView.frame.height > piece.superview!.frame.height) && (((imgView.frame.minX <= originalFrame.minX) || (imgView.frame.maxX >= originalFrame.maxX)) || (imgView.frame.minY <= originalFrame.minY) || (imgView.frame.maxY >= originalFrame.maxY)) {
            let newCenter = CGPoint(x: initialCenter.x + translation.x, y: initialCenter.y + translation.y)
            print(newCenter)
            piece.center = newCenter
        }
    } else {
        // On cancellation, return the piece to its original location.
        piece.center = initialCenter
    }
}

捏手勢

@IBAction func imgPinchGesture(_ sender: UIPinchGestureRecognizer) {
    var newScale = sender.scale
    if sender.state == .began {
        lastScale = self.imgView.frame.width/self.imgView.bounds.size.width
    }
    newScale = newScale * lastScale
    
    if newScale < minScale {
        newScale = minScale
    } else if newScale > maxScale {
        newScale = maxScale
    }
    
    let currentScale = self.imgView.frame.width/self.imgView.bounds.size.width
    self.imgView.transform = CGAffineTransform(scaleX: newScale, y: newScale)
        print("last Scale: \(lastScale), current scale: \(currentScale), new scale: \(newScale), gestureRecognizer.scale: \(sender.scale)")
}
 lazy var pdfView: PDFView = {
    let pdfView = PDFView()
    pdfView.displaysPageBreaks = true
    pdfView.enableDataDetectors = true
    pdfView.subviews[0].backgroundColor = .clear
    pdfView.maxScaleFactor = 4
    return pdfView
}()

然后在聲明 pdf 視圖后,您應該添加一個將圖像轉換為 pdfdocument 的 func

func createPDF(image: UIImage) -> PDFDocument {
 let document = PDFDocument()

 guard let cgImage = image.cgImage else { return document }

 let image = UIImage(cgImage: cgImage, scale: image.scale, orientation: .downMirrored)

 guard let imagePDF = PDFPage(image: image) else { return document }

 document.insert(imagePDF, at: document.pageCount)

 return document
}

之后在 viewDidAppear 中子查看您的 pdf 之后...您可以將此 pdfDocument 分配給您的 pdf

pdfView.document = createPDF(image: "yourImage")
pdfView.autoScale = true

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM