2015-05-03 14 views
23

Ich hatte gehofft, jemand könnte mir helfen. Ich versuche, einem Benutzer das Zoomen auf eine UIImageView zu erlauben (mit einem zulässigen Höchst- und Höchstwert). Aber aus irgendeinem Grund funktioniert das nicht richtig. Das Bild zoomt etwas und springt dann einfach zurück. Vielen Dank.UIImageView prise zoom swift

hier ist das Zoom-func

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 

    } 

} 
+6

Sie können die Open Source ImageScrollView verwenden, eine zoombare und scrollbare Bildansicht. https://github.com/huynguyencong/ImageScrollView – huync

+2

^^^ Das hat gut funktioniert für mich, dauerte alle etwa 30 Sekunden. Danke –

Antwort

33

ich die Imageview zu einem UIScrollView hinzuzufügen entschieden. Es erlaubt dem Benutzer zu zoomen und zu schwenken. Hier ist der Code, den ich benutzt habe.

um max/min Zoom einstellen I verwendet:

scrollImg.minimumZoomScale = 1.0 
    scrollImg.maximumZoomScale = 10.0 

hier ist der Rest des Codes.

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!) 

musste ich auch auch

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

Aus meiner Sicht hinzufügen, Ihre Bestimmung von currentScale. Es entspricht immer 1, weil Sie den Maßstab Ihrer Bildansicht ändern. Sie sollten Ihre currentScale wie folgt vergeben:

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

Sie ImageScrollView Open Source verwenden können, eine zoombare und rollbaren Bildansicht. http://github.com/huynguyencong/ImageScrollView

Gefällt Ihnen dieses Open-Source, fügen Image zu Scroll

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() 
    } 
} 
50

UIImageView Pinch-Zoom mit UIScrollView || Bild zoomen ios in schnellen 3 und Xcode 8 Brief

Satz UIScrollView Delegierter in Storyboard enter image description here

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 
    } 
+3

Bemerkenswert! Es ist wirklich so einfach wie dieser Beitrag sagt! – instanceof

+1

Dies sollte die akzeptierte Antwort für Swift 3 sein.Nichts anderes, was ich versucht habe, funktioniert, einschließlich der oben genannten Antwort. – hawmack13

+1

Es ist nicht erforderlich, den delegierten Rollsichten-Delegierten im Code festzulegen, da dieser bereits über das Storyboard festgelegt wurde (siehe Abbildung oben). – C6Silver

0

Ich denke, das größte Problem am Ende Ihres func ist, haben Sie sender.scale = 1. Wenn Sie diese Codezeile entfernen, sollte Ihr Bild nicht jedes Mal zurückspringen.

1

Swift 3 -Lösung

standardmäßig UIImageView des userInterations ist deaktiviert. Ermöglicht es vor dem Hinzufügen aller Gesten in UIImageView. (imgView.isUserInteractionEnabled = true)

func zoom(sender: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 
    } 
} 
+1

versuchen, klar zu erklären ... was ist lastScale was ist neue Skala hier, wo hast du sie erklärt, was ist ihre Unterklasse – srivas

1

Swift 3 -Lösung

Dies ist der Code I verwendet. Ich habe imageView zu scrollView als Unteransicht hinzugefügt.

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 
} 
0

posted ich eine Antwort here für Zoom-Funktionalität sowohl mit Pinch-und Doppel-Tippen in Swift 3. perfekt funktioniert.