swift uiimageview uipinchgesturerecognizer

swift - UIImageView pellizcar zoom rápido



uipinchgesturerecognizer (13)

Esperaba que alguien pudiera ayudarme. Estoy tratando de permitir que un usuario pellizque el zoom en un UIImageView (con un nivel máximo y mínimo permitido). Pero por alguna razón, no funciona bien. La imagen se amplía un poco y luego se recupera. Gracias.

aquí está la función de zoom

func zoom(sender:UIPinchGestureRecognizer) { if sender.state == .Ended || sender.state == .Changed { let currentScale = self.view.frame.size.width / self.view.bounds.size.width var newScale = currentScale*sender.scale if newScale < 1 { newScale = 1 } if newScale > 9 { newScale = 9 } let transform = CGAffineTransformMakeScale(newScale, newScale) self.imageView?.transform = transform sender.scale = 1 } }


Al admitir Swift 5.1 , puede crear una extensión de UIImageView , como esta:

let currentScale = sender.view!.frame.size.width / sender.view!.bounds.size.width


Creo que el mayor problema es al final de su func , tiene sender.scale = 1 . Si elimina esa línea de código, su imagen no debería recuperarse cada vez.


Decidí agregar el imageView a un UIScrollView. Permite al usuario hacer zoom y desplazarse. Aquí está el código que usé.

Para establecer el zoom máximo / mínimo que utilicé:

scrollImg.minimumZoomScale = 1.0 scrollImg.maximumZoomScale = 10.0

Aquí está el resto del código.

var vWidth = self.view.frame.width var vHeight = self.view.frame.height var scrollImg: UIScrollView = UIScrollView() scrollImg.delegate = self scrollImg.frame = CGRectMake(0, 0, vWidth!, vHeight!) scrollImg.backgroundColor = UIColor(red: 90, green: 90, blue: 90, alpha: 0.90) scrollImg.alwaysBounceVertical = false scrollImg.alwaysBounceHorizontal = false scrollImg.showsVerticalScrollIndicator = true scrollImg.flashScrollIndicators() scrollImg.minimumZoomScale = 1.0 scrollImg.maximumZoomScale = 10.0 defaultView!.addSubview(scrollImg) imageView!.layer.cornerRadius = 11.0 imageView!.clipsToBounds = false scrollImg.addSubview(imageView!)

También tuve que agregar esto también

func viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView? { return self.imageView }

Prototipo de función Swift 3 y superior

func viewForZooming(in scrollView: UIScrollView) -> UIView? { return self.mainImage }


En mi opinión, el problema es su determinación de currentScale. Siempre es igual a 1, porque cambia la escala de su imageView. Debe asignar su escala actual de la siguiente manera:

open class ImageScrollView: UIScrollView { var zoomView: UIImageView? = nil } extension ImageScrollView: UIScrollViewDelegate{ public func viewForZooming(in scrollView: UIScrollView) -> UIView? { return zoomView } public func scrollViewDidZoom(_ scrollView: UIScrollView) { adjustFrameToCenter() } }


Esta es una vieja pregunta pero no veo ninguna respuesta que explique qué está mal con el código original.

Esta línea:

self.imageView.contentScaleFactor = 3

Está trabajando en la vista principal en lugar de en la vista de imagen, por lo que el cálculo de la escala siempre es ~ 1

Este simple cambio hace que se comporte como se esperaba

let myImageView = UIImageView(image: myImage) myImageView.isUserInteractionEnabled = true let pinchMethod = UIPinchGestureRecognizer(target: self, action: #selector(pinchImage(sender:))) myImageView.addGestureRecognizer(pinchMethod) @objc func pinchImage(sender: UIPinchMethodRecognizer) { guard let sender.view != nil else { return } if let scale = (sender.view?.transform.scaledBy(x: sender.scale, y: sender.scale)) { guard scale.a > 1.0 else { return } guard scale.d > 1.0 else { return } sender.view?.transform = scale sender.scale = 1.0 } }

Cambiando al remitente (y forzando la vista a desenvolver) el cálculo de la escala funciona como se esperaba.


La opción para swift 4

class ViewController: UIViewController, UIScrollViewDelegate { @IBOutlet weak var scrolView: UIScrollView! @IBOutlet weak var imgPhoto: UIImageView! override func viewDidLoad() { super.viewDidLoad() scrolView.delegate = self scrolView.minimumZoomScale = 1.0 scrolView.maximumZoomScale = 10.0 } func viewForZooming(in scrollView: UIScrollView) -> UIView? { return imgPhoto } }


Publiqué una respuesta here para la funcionalidad de zoom con pellizco y doble toque en Swift 3. Funciona perfectamente.


Puede usar el código abierto ImageScrollView, una vista de imagen desplazable y con zoom. http://github.com/huynguyencong/ImageScrollView

Al igual que este código abierto, agregue ImageView a ScrollView

let currentScale = self.imageView?.frame.size.width / self.imageView?.bounds.size.width


Solución Swift 3

Este es el código que usé. Agregué imageView a scrollView como una subvista.

let currentScale = self.view.frame.size.width / self.view.bounds.size.width


Solución Swift 3

Por defecto, la UIImageView''s userInteration está deshabilitada. Habilítelo antes de agregar cualquier gesto en UIImageView .

imgView.isUserInteractionEnabled = true

El factor de escala relativo a los puntos de los dos toques en las coordenadas de la pantalla.

var lastScale:CGFloat! func zoom(gesture:UIPinchGestureRecognizer) { if(gesture.state == .began) { // Reset the last scale, necessary if there are multiple objects with different scales lastScale = gesture.scale } if (gesture.state == .began || gesture.state == .changed) { let currentScale = gesture.view!.layer.value(forKeyPath:"transform.scale")! as! CGFloat // Constants to adjust the max/min values of zoom let kMaxScale:CGFloat = 2.0 let kMinScale:CGFloat = 1.0 var newScale = 1 - (lastScale - gesture.scale) newScale = min(newScale, kMaxScale / currentScale) newScale = max(newScale, kMinScale / currentScale) let transform = (gesture.view?.transform)!.scaledBy(x: newScale, y: newScale); gesture.view?.transform = transform lastScale = gesture.scale // Store the previous scale factor for the next pinch gesture call } }


Terminé aquí, probablemente buscando el camino equivocado.

Estaba después de tener mi imageView en contentMode = .centre. Pero estaba juzgando que también se acercó y estaba buscando una forma de alejarlo. Así es cómo:

self.imageView.contentScaleFactor = 3

1 es como si estuvieras haciendo algo. Más de 1 se aleja ... 3 funciona para mí, pero necesita probarlo.


Usando Swift 5.0, así es como funciona para mí:

class ZoomViewController: UIViewController,UIScrollViewDelegate { @IBOutlet weak var scrollView:UIScrollView! @IBOutlet weak var imageView:UIImageView! override func viewDidLoad() { super.viewDidLoad() scrollView.delegate = self scrollView.minimumZoomScale = 1.0 scrollView.maximumZoomScale = 10.0//maximum zoom scale you want scrollView.zoomScale = 1.0 } func viewForZooming(in scrollView: UIScrollView) -> UIView? { return imageView }

Puede usar scale.a, scale.b, scale.c, scale.d, scale.tx y scale.ty para establecer sus límites de escala.


Zoom de pellizco UIImageView con UIScrollView || ios de zoom de imagen en URL de video de Youtube de swift 3 y Xcode 8 letras

Establecer delegado uiscrollview en el guión gráfico

class PhotoDetailViewController: UIViewController, UIScrollViewDelegate { @IBOutlet weak var scrollView: UIScrollView! @IBOutlet weak var imgPhoto: UIImageView! override func viewDidLoad() { super.viewDidLoad() scrollView.minimumZoomScale = 1.0 scrollView.maximumZoomScale = 6.0 // scrollView.delegate = self - it is set on the storyboard. } func viewForZooming(in scrollView: UIScrollView) -> UIView? { return imgPhoto }