UIImageView pinch zoom swift

前端 未结 13 727
误落风尘
误落风尘 2020-11-28 04:06

I was hoping someone could help me out. I am trying to allow a user to pinch zoom on a UIImageView(with a max and min level allowed). But for some reason the it does not wor

相关标签:
13条回答
  • 2020-11-28 04:35

    UIImageView pinch zoom with UIScrollView || image zooming ios in swift 3 and Xcode 8 letter Youtube video URL

    set uiscrollview Delegate in storyboard

     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
        }
    
    0 讨论(0)
  • 2020-11-28 04:38

    Using Swift 5.0, here is how it works for me:

    let myImageView = UIImageView(image: myImage)
    myImageView.isUserInteractionEnabled = true
    let pinchMethod = UIPinchGestureRecognizer(target: self, action: #selector(pinchImage(sender:)))
    myImageView.addGestureRecognizer(pinchMethod)
    
    @objc func pinchImage(sender: UIPinchGestureRecognizer) {
      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
     }
    }
    

    You can use scale.a, scale.b, scale.c, scale.d, scale.tx and scale.ty to set your scale limits.

    0 讨论(0)
  • 2020-11-28 04:38

    I ended up here, probably searching the wrong way.

    I was after having my imageView in contentMode = .centre. But I was judging it too zoomed in and I was searching a way to zoom it out. Here's how:

        self.imageView.contentScaleFactor = 3
    

    1 is as if you were doing anything. More that 1 zooms out... 3 works for me but you need to test it out.

    0 讨论(0)
  • 2020-11-28 04:41

    You can use ImageScrollView open source, a zoomable and scrollable image view. http://github.com/huynguyencong/ImageScrollView

    Like this opensource, add ImageView to ScrollView

    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()
        }
    }
    
    0 讨论(0)
  • 2020-11-28 04:43

    Swift 3 solution

    By default UIImageView's userInteration is disabled. Enable it before adding any gestures in UIImageView.

    imgView.isUserInteractionEnabled = true

    The scale factor relative to the points of the two touches in screen coordinates

    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
      }
    }
    
    0 讨论(0)
  • 2020-11-28 04:44

    In my view, the problem is your determination of currentScale. It always equals 1, because you change the scale of your imageView. You should assign your currentScale as follows:

    let currentScale = self.imageView?.frame.size.width / self.imageView?.bounds.size.width  
    
    0 讨论(0)
提交回复
热议问题