ios - 使用 Swift 中的 UIScrollView 从用户的触摸点放大图像

标签 ios swift optimization uiscrollview uiimage

下面的 Swift 代码管理 UIScrollView 内的 UIImage 的放大和缩小。

双击时,图像会向中心放大并向中心缩小。

问题:

需要更改哪些代码才能将放大点设置为用户在屏幕上触摸的图像区域的中心?

(例如,如果用户双击图像的左上角,图像将相应地放大到图像的左上角。)

class ScrollViewController: UIViewController, UIScrollViewDelegate {
    var scrollView: UIScrollView!
    var imageView: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()

        imageView = UIImageView(image: UIImage(named: "image.png"))

        scrollView = UIScrollView(frame: view.bounds)
        scrollView.backgroundColor = UIColor.blackColor()
        scrollView.contentSize = imageView.bounds.size
        scrollView.autoresizingMask = [UIViewAutoresizing.FlexibleWidth, UIViewAutoresizing.FlexibleHeight]

        scrollView.contentOffset = CGPoint(x: 1000, y: 450)

        scrollView.addSubview(imageView)
        view.addSubview(scrollView)

        scrollView.delegate = self
        setZoomScale()
        setupGestureRecognizer()
    }

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

    override func viewWillLayoutSubviews() {
        setZoomScale()
    }

    func setZoomScale() {
        let imageViewSize = imageView.bounds.size
        let scrollViewSize = scrollView.bounds.size
        let widthScale = scrollViewSize.width / imageViewSize.width
        let heightScale = scrollViewSize.height / imageViewSize.height

        scrollView.minimumZoomScale = min(widthScale, heightScale)
        scrollView.zoomScale = 1.0
    }

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

    func setupGestureRecognizer() {
        let doubleTap = UITapGestureRecognizer(target: self, action: "handleDoubleTap:")
        doubleTap.numberOfTapsRequired = 2
        scrollView.addGestureRecognizer(doubleTap)
    }

    func handleDoubleTap(recognizer: UITapGestureRecognizer) {
        if (scrollView.zoomScale > scrollView.minimumZoomScale) {
            scrollView.setZoomScale(scrollView.minimumZoomScale, animated: true)
        } else {
            scrollView.setZoomScale(scrollView.maximumZoomScale, animated: true)
        }
    }
}

最佳答案

根据 this post .对我来说效果很好。

func handleDoubleTap(recognizer: UITapGestureRecognizer) {
    if (scrollView.zoomScale > scrollView.minimumZoomScale) {
        scrollView.setZoomScale(scrollView.minimumZoomScale, animated: true)
    } else {
        let touchPoint = recognizer.locationInView(view)
        let scrollViewSize = scrollView.bounds.size

        let width = scrollViewSize.width / scrollView.maximumZoomScale
        let height = scrollViewSize.height / scrollView.maximumZoomScale 
        let x = touchPoint.x - (width/2.0)
        let y = touchPoint.y - (height/2.0)

        let rect = CGRectMake(x, y, width, height)
        scrollView.zoomToRect(rect, animated: true)
    }
}

关于ios - 使用 Swift 中的 UIScrollView 从用户的触摸点放大图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38855581/

相关文章:

ios - 如何查询用户的帖子?

swift - 如何在 SKScene 中设置自定义光标? (XCode、Swift4、Spritekit)

python - 在具有实际值的 cvxpy 中检查约束是可以的

c - 为什么代码不断调用 mmap 和 munmap?

c++ - 优化器何时可以组合对成员函数的调用?

ios - UILabel 不居中

ios - 为什么这个应用程序从 Testflight 运行时会崩溃 100%,而从 Xcode 运行时可能会崩溃 10%

ios - 如何在网格上选择最接近中心的线?

ios - 如果我显示 destinationViewController,自定义 Fade Segue 不会设置动画

ios - SpriteKit 动画 - 保持 Sprite 固定