缩放,平移和双击手势在UIImageView



我想在imageview上应用这些手势,但有以下限制:

1)双击:缩放图像两次,然后返回到原始大小

2)缩放:缩放图像与最大限制和最小限制的原始尺寸

3)平移:当图像缩放时,移动图像和图像视图不应平移超过一个边界

我已经尝试了以下代码使用教程,但平移不正常工作,我认为有时也会影响其他人的手势:

请让我知道我做错了什么。

属性:

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视图之后,你应该添加一个函数将图像转换为PDF文档

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

最新更新