2016-08-09 175 views
0

Der folgende Swift-Code ermöglicht das Zoomen innerhalb eines UIImage innerhalb eines UIScrollView.Vergrößern eines Bildes vom Benutzerkontaktpunkt mit UIScrollView in Swift

Beim Doppeltippen zoomt das Bild in die Mitte und zoomt in die Mitte.

Frage:

Welche Code-Änderungen müssen den Zoom in Punkt setzen vorgenommen werden das Zentrum des Bildbereichs zu sein, der Benutzer auf dem Bildschirm berührt?

(zum Beispiel, wenn der Benutzer doppelt tippt die obere linke Ecke des Bildes, das Bild entsprechend in die obere linken Ecke des Bildes vergrößern würde.)

class ScrollViewController: UIViewController, UIScrollViewDelegate { 
    var scrollView: UIScrollView! 
    var imageView: UIImageView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     imageView = UIImageView(image: UIImage(named: "image.png")) 

     scrollView = UIScrollView(frame: view.bounds) 
     scrollView.backgroundColor = UIColor.blackColor() 
     scrollView.contentSize = imageView.bounds.size 
     scrollView.autoresizingMask = [UIViewAutoresizing.FlexibleWidth, UIViewAutoresizing.FlexibleHeight] 

     scrollView.contentOffset = CGPoint(x: 1000, y: 450) 

     scrollView.addSubview(imageView) 
     view.addSubview(scrollView) 

     scrollView.delegate = self 
     setZoomScale() 
     setupGestureRecognizer() 
    } 

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

    override func viewWillLayoutSubviews() { 
     setZoomScale() 
    } 

    func setZoomScale() { 
     let imageViewSize = imageView.bounds.size 
     let scrollViewSize = scrollView.bounds.size 
     let widthScale = scrollViewSize.width/imageViewSize.width 
     let heightScale = scrollViewSize.height/imageViewSize.height 

     scrollView.minimumZoomScale = min(widthScale, heightScale) 
     scrollView.zoomScale = 1.0 
    } 

    func scrollViewDidZoom(scrollView: UIScrollView) { 
     let imageViewSize = imageView.frame.size 
     let scrollViewSize = scrollView.bounds.size 
     let verticalPadding = imageViewSize.height < scrollViewSize.height ? (scrollViewSize.height - imageViewSize.height)/2 : 0 
     let horizontalPadding = imageViewSize.width < scrollViewSize.width ? (scrollViewSize.width - imageViewSize.width)/2 : 0 

     scrollView.contentInset = UIEdgeInsets(top: verticalPadding, left: horizontalPadding, bottom: verticalPadding, right: horizontalPadding) 
    } 

    func setupGestureRecognizer() { 
     let doubleTap = UITapGestureRecognizer(target: self, action: "handleDoubleTap:") 
     doubleTap.numberOfTapsRequired = 2 
     scrollView.addGestureRecognizer(doubleTap) 
    } 

    func handleDoubleTap(recognizer: UITapGestureRecognizer) { 
     if (scrollView.zoomScale > scrollView.minimumZoomScale) { 
      scrollView.setZoomScale(scrollView.minimumZoomScale, animated: true) 
     } else { 
      scrollView.setZoomScale(scrollView.maximumZoomScale, animated: true) 
     } 
    } 
} 

Antwort

3

Nach this post. Es funktioniert gut mit mir.

func handleDoubleTap(recognizer: UITapGestureRecognizer) { 
    if (scrollView.zoomScale > scrollView.minimumZoomScale) { 
     scrollView.setZoomScale(scrollView.minimumZoomScale, animated: true) 
    } else { 
     let touchPoint = recognizer.locationInView(view) 
     let scrollViewSize = scrollView.bounds.size 

     let width = scrollViewSize.width/scrollView.maximumZoomScale 
     let height = scrollViewSize.height/scrollView.maximumZommScale 
     let x = touchPoint.x - (width/2.0) 
     let y = touchPoint.y - (height/2.0) 

     let rect = CGRectMake(x, y, width, height) 
     scrollView.zoomToRect(rect, animated: true) 
    } 
} 
+0

Danke @Wei Jay für die Veröffentlichung Ihrer Antwort. Leider funktioniert das nur, wenn der 'UIScrollView' Inhalt enthält, der mit der Bildschirmgröße identisch ist. Es funktioniert zum Beispiel nicht für ein 'UIImageView', das breiter, höher oder gezoomt auf dem Bildschirm ist. Wenn Sie diesen größeren Inhaltstyp doppelt antippen, ist das Zoomen auf den berührten Punkt nicht korrekt, sondern zoomt auf einen anderen Teil des Inhalts. Ich werde basteln, aber wenn Sie irgendwelche anderen Vorschläge haben, bitte aktualisieren Sie den Code? Vielen Dank. Prost. – user4806509

+0

@ user4806509 Ich versuche das auch in Swift 3 herauszufinden. Irgendwas Glück? –

1

Hier ist eine Swift 2.3 Funktion, um die Position einer Berührung innerhalb einer zoombaren UIScrollView zu der Suche nach

  • UIScrollView mit UIImageView innerhalb
  • Vergrößerte oder nicht - scrollView.zoomScale
  • imageView.contentMode = .ScaleAspectFit
  • Das Bild kann größer sein, hohe Res als Bildansicht und scrollView
  • Jede Form des Bildes, Portrait, Landschaft oder quadratisch

imageView.contentMode = .ScaleAspectFit

//import AVFoundation // needed for AVMakeRectWithAspectRatioInsideRect() 

func getLocationOfTouchInImageInScrollView(paintLocation:CGPoint)->CGPoint { 

    let imageSize = imageViewInScrollView.image!.size 
    let imageFrame = scrollView.frame 
    let imageRect = AVMakeRectWithAspectRatioInsideRect(imageSize, imageFrame) 
    let imageHeightToViewHeight = max(imageSize.height, imageSize.width)/imageFrame.size.height 

    let px = (max(0, min(imageSize.width, ((paintLocation.x - imageRect.origin.x) * imageHeightToViewHeight)))) 
    let py = (max(0, min(imageSize.height, ((paintLocation.y - imageRect.origin.y) * imageHeightToViewHeight)))) 
    var imageTouchPoint = CGPointMake(CGFloat(px), CGFloat(py)) 

    return imageTouchPoint 
} 

mich Tage gedauert hat, diese zu schreiben, da ich nicht die imageHeightToViewHeight Variable herausfinden konnte, dachte da war noch etwas anderes lustiges.