Masashi
Masashi

Reputation: 350

Image inside Scrollview with gestures

I have a control I'm making that includes having an image inside a scrollview, and I applied many gestures to it especially for zooming (pinch). Problem is, I want the scrollView's content size to match image new size without affecting:

If there was anything not clear, please let me know.

Upvotes: 0

Views: 61

Answers (1)

Pragnesh Vitthani
Pragnesh Vitthani

Reputation: 2540

You should do like this:

Swift3:

import UIKit

class ViewController: UIViewController,UIScrollViewDelegate
{
    @IBOutlet weak var ScrollView: UIScrollView!
    @IBOutlet weak var ScrollImgView: UIImageView!

override func viewDidLoad()
{
    super.viewDidLoad()

    self.ScrollView.minimumZoomScale = 0.1
    self.ScrollView.maximumZoomScale = 5.0
    ScrollView.isUserInteractionEnabled = true
}
func viewForZooming(in scrollView: UIScrollView) -> UIView?
{
    return self.ScrollImgView
}
func scrollViewDidZoom(_ scrollView: UIScrollView)
{
    let imgViewSize:CGSize! = self.ScrollImgView.frame.size;
    let imageSize:CGSize! = self.ScrollImgView.image?.size;

    var realImgSize : CGSize;
    if(imageSize.width / imageSize.height > imgViewSize.width / imgViewSize.height)
    {
        realImgSize = CGSize(width: imgViewSize.width,height: imgViewSize.width / imageSize.width * imageSize.height);
    }
    else
    {
        realImgSize = CGSize(width: imgViewSize.height / imageSize.height * imageSize.width, height: imgViewSize.height);
    }
    var fr:CGRect = CGRect.zero
    fr.size = realImgSize;
    self.ScrollImgView.frame = fr;

    let scrSize:CGSize = scrollView.frame.size;
    let offx:CGFloat = (scrSize.width > realImgSize.width ? (scrSize.width - realImgSize.width) / 2 : 0);
    let offy:CGFloat = (scrSize.height > realImgSize.height ? (scrSize.height - realImgSize.height) / 2 : 0);
    scrollView.contentInset = UIEdgeInsetsMake(offy, offx, offy, offx);

    let scrollViewSize:CGSize = self.scrollViewVisibleSize();

    var imageCenter:CGPoint = CGPoint(x: self.ScrollView.contentSize.width/2.0, y:
        self.ScrollView.contentSize.height/2.0);

    let scrollViewCenter:CGPoint = self.scrollViewCenter()

    if (self.ScrollView.contentSize.width < scrollViewSize.width)
    {
        imageCenter.x = scrollViewCenter.x;
    }

    if (self.ScrollView.contentSize.height < scrollViewSize.height)
    {
        imageCenter.y = scrollViewCenter.y;
    }

    self.ScrollImgView.center = imageCenter;
}
func scrollViewCenter() -> CGPoint
{
    let scrollViewSize:CGSize = self.scrollViewVisibleSize()
    return CGPoint(x: scrollViewSize.width/2.0, y: scrollViewSize.height/2.0);
}
func scrollViewVisibleSize() -> CGSize
{
    let contentInset:UIEdgeInsets = self.ScrollView.contentInset;
    let scrollViewSize:CGSize = self.ScrollView.bounds.standardized.size;
    let width:CGFloat = scrollViewSize.width - contentInset.left - contentInset.right;
    let height:CGFloat = scrollViewSize.height - contentInset.top - contentInset.bottom;
    return CGSize(width:width, height:height);
}

override func didReceiveMemoryWarning()
{
    super.didReceiveMemoryWarning()
}
}

Upvotes: 1

Related Questions