Search code examples
iosswiftuiscrollviewuiimageview

Calling 'scrollView.zoom' Does Not Zoom


For some reason scrollView.zoom does not zoom in on an imageView.

I have an imageView inside a scrollView.

in ViewDidLoad:

        scrollView.minimumZoomScale = 1.0
        scrollView.maximumZoomScale = 2.0
        scrollView.delegate = self

viewForZooming:

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

Now, I'm calling below after both scrollView and imageView are initialized.


var scale: CGFloat = 2

let location = CGPoint(x: imageView.frame.width/2, y: imageView.frame.height/2)
scrollView.zoom(to: zoomRectForScale(scale, center: location), animated: true)

Nothing is happening after scrollView.zoom is called. I tried doing

view.setNeedsDisplay()
view.layoutIfNeeded()

Still nothing happens, imageView is not zooming in.

UPDATE:

As requested, here is the code for scrollView and imageView initialization:

func createscrollView(image: UIImage?){

    if image == nil{
        let img = UIImage(named: "demo image.jpg")
        let imgCorrected = scaleAndOrient(image: img!)

        //created user selecged images
        userSelectedImage_UI = img
        userSelectedImage_UI_Corrected = imgCorrected
    }


    // create image scroll view
    scrollView = UIScrollView(frame: CGRect(x: 0, y: 0,width: 100, height: 100))
    scrollView.showsHorizontalScrollIndicator = false
    scrollView.showsVerticalScrollIndicator = false
    scrollView.bouncesZoom = false
    scrollView.bounces = false
    scrollView.contentMode = .scaleAspectFill

    view.addSubview(scrollView)

    scrollView.translatesAutoresizingMaskIntoConstraints = false

    NSLayoutConstraint.activate([
        scrollView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 0),
        scrollView.leftAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leftAnchor, constant: 0),
        scrollView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -150),
        scrollView.rightAnchor.constraint(equalTo: view.safeAreaLayoutGuide.rightAnchor, constant: 0)
    ])


    // add image view to scrollview
    imageView = UIImageView(frame: CGRect(x: 0, y: 0,width: 100, height: 100))
    scrollView.addSubview(imageView)

    imageView.translatesAutoresizingMaskIntoConstraints = false

    NSLayoutConstraint.activate([
        imageView.topAnchor.constraint(equalTo: scrollView.contentLayoutGuide.topAnchor, constant: 0),
        imageView.leftAnchor.constraint(equalTo: scrollView.contentLayoutGuide.leftAnchor, constant: 0),
        imageView.bottomAnchor.constraint(equalTo: scrollView.contentLayoutGuide.bottomAnchor, constant: 0),
        imageView.rightAnchor.constraint(equalTo: scrollView.contentLayoutGuide.rightAnchor, constant: 0),
        imageView.widthAnchor.constraint(equalTo: scrollView.widthAnchor, multiplier: 1),
        imageView.heightAnchor.constraint(equalTo: scrollView.heightAnchor, multiplier: 1)
    ])

    imageView.contentMode = .scaleAspectFit

    if image == nil{
        imageView.image = userSelectedImage_UI_Corrected

    } else {
        imageView.image = scaleAndOrient(image: image!)
    }


}


Solution

  • Based on comments...

    It sounds like you are creating / setting up your scrollView and its content imageView from viewDidLoad() and then immediately trying to "zoom" it.

    If so, that will be problematic, as auto-layout hasn't finished laying out the UI elements.

    You can call it from:

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
    
        var scale: CGFloat = 2
        let location = CGPoint(x: imageView.frame.width/2, y: imageView.frame.height/2)
        scrollView.zoom(to: zoomRectForScale(scale, center: location), animated: true)
    }