图像放大后,UIScrollView滚出图像?

时间:2017-05-15 11:52:12

标签: ios swift image-zoom

我尝试使用UIScrollview实现图像缩放功能。在哪里我保持图像适合方面。 图像位于UIScrollView内部,图像框架的类似于UIScrollView。 这是我的代码。

 override func viewDidLoad()
    {
        super.viewDidLoad()

        // Do any additional setup after loading the view.

        scroller.minimumZoomScale = 1.0
        scroller.maximumZoomScale = 7.0
    }

    // MARK: - User Defined Methods

    @IBAction func doubleTapGestureAction(_ sender: UITapGestureRecognizer)
    {
        if scroller.zoomScale == 1
        {
            scroller.zoom(to: zoomForScale(scale: scroller.maximumZoomScale, center: sender.location(in: sender.view)), animated: true)
        }
        else
        {
            scroller.setZoomScale(1, animated: true)
        }
        print(isZoomedIn)
    }

    func zoomForScale(scale: CGFloat, center: CGPoint) -> CGRect
    {
        var zoomRect = CGRect.zero
        zoomRect.size.height = image.frame.size.height / scale
        zoomRect.size.width  = image.frame.size.width  / scale
        let newCenter = image.convert(center, from: scroller)
        zoomRect.origin.x = newCenter.x - (zoomRect.size.width / 2.0)
        zoomRect.origin.y = newCenter.y - (zoomRect.size.height / 2.0)
        return zoomRect
    }

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

2 个答案:

答案 0 :(得分:0)

看看这些方法。可能会有所帮助。我有滚动视图拉伸到控制器的视图大小。 customizeScrollView()将计算最小和最大比例选项。 centerImageView()将UIImageView放在UIScrollView的中心

在viewDidload中调用customizeScrollView函数。

fileprivate func customizeScrollView() {
    guard let image = imageView?.image else { return }
    var minZoom = fmin(self.view.frame.width / image.size.width, self.view.frame.height / image.size.height)
    minZoom = fmin(1.0, minZoom)

    scrollView?.contentSize = image.size
    scrollView?.minimumZoomScale = minZoom
    scrollView?.addSubview(self.imageView!)
    scrollView?.setZoomScale(minZoom, animated: false)
    centerImageView()
}

fileprivate func centerImageView() {
    guard let imageView = imageView else { return }
    guard let scrollView = scrollView else { return }

    let boundsSize = scrollView.bounds.size
    var frameToCenter = imageView.frame

    // Center horizontally
    if frameToCenter.size.width < boundsSize.width {
        frameToCenter.origin.x = (boundsSize.width - frameToCenter.size.width) / 2
    } else {
        frameToCenter.origin.x = 0
    }

    // Center vertically
    if frameToCenter.size.height < boundsSize.height {
        frameToCenter.origin.y = (boundsSize.height - frameToCenter.size.height) / 2
    } else {
        frameToCenter.origin.y = 0
    }

    imageView.frame = frameToCenter
}

 public func scrollViewDidZoom(scrollView: UIScrollView) {

        print(imageView.frame)
        centerImageView()
    }

答案 1 :(得分:0)

以下是示例代码:

import UIKit

class ViewController: UIViewController,UIScrollViewDelegate {

    var imgDemo: UIImageView = {
        let img = UIImageView()
        img.contentMode = .scaleAspectFill
        img.isUserInteractionEnabled = true
        return img
    }()


    var scrollView:UIScrollView = {
        let scroll = UIScrollView()
        scroll.maximumZoomScale = 4.0
        scroll.minimumZoomScale = 0.25
        scroll.clipsToBounds = true
        return scroll
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
        imgDemo.frame = CGRect(x: 0, y: 0, width: view.frame.size.width, height: view.frame.size.height)
        imgDemo.image = UIImage(named: "5.jpg")
        scrollView.delegate = self
        scrollView.frame = imgDemo.frame
        scrollView.addSubview(imgDemo)
        view.addSubview(scrollView)
    }

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

}