ioio007
ioio007

Reputation: 247

How to make image view always be center of screen when scale using scroll view?

Now I have following view hierarchy:

My view hierarchy is a little complicated since I need both scale and rotate, and also I need to keep the relationship of position of map and arrow, I have been working around for a long time and find this solution.

Now My question is how to keep Arrow Image View always in center of screen when I scale?

Here is some of my code:

func viewForZooming(in scrollView: UIScrollView) -> UIView? {
    return Container For Scale View
}

func scrollViewDidZoom(_ scrollView: UIScrollView) {
    let imageViewSize = MapImageView.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)
}

Upvotes: 4

Views: 785

Answers (1)

Prashant Tukadiya
Prashant Tukadiya

Reputation: 16446

Here you need some Math

As your scale container view is larger as per your zoom scale you need to convert center point relative to super UIView

lets say your Container For Scale View is viewBase

        var center = self.view.center

after that convert your image point same

         let convertedImagePoint = self.viewBase.convert(imageView.center, to: self.view)

Now get Difff

        let diff = convertedImagePoint.y - center.y


        DispatchQueue.main.async {
            self.scrollView1.contentOffset.y += diff
        }

Hope it is helps

Upvotes: 2

Related Questions