简体   繁体   中英

UIScrollView how to restore to original size after UIImageView pinch zoom

I have a collection view containing several images. I can zoom an image in the cell but I want it and the scroll view to return to its original size on a tap gesture. My tap gesture restores the image to it's original size but it's off the screen and the scroll view remains it's zoomed size. Here is my code:

import UIKit

class ZoomingCollectionViewCell: UICollectionViewCell, UIScrollViewDelegate {

let zoomScrollView: UIScrollView = {
    let scrollView = UIScrollView()
    scrollView.backgroundColor = .white
    scrollView.isUserInteractionEnabled = true
    scrollView.translatesAutoresizingMaskIntoConstraints = false
    scrollView.minimumZoomScale = 1.0
    scrollView.maximumZoomScale = 6.0
    scrollView.clipsToBounds = true
    return scrollView
}()

var itemImageView: UIImageView = {
    let imageView = UIImageView()
    imageView.contentMode = .scaleAspectFit 
    imageView.translatesAutoresizingMaskIntoConstraints = false
    imageView.backgroundColor = .white
    imageView.isUserInteractionEnabled = true
    return imageView
}()

var originalSize: CGRect!

override init(frame: CGRect) {
    super.init(frame: frame)

    contentView.backgroundColor = .white

    zoomScrollView.delegate = self

    itemImageView.frame = CGRect(x: 0, y: 0, width: contentView.frame.size.width, height: contentView.frame.size.height)

    zoomScrollView.frame = itemImageView.frame

    originalSize = itemImageView.frame

    let tap = UITapGestureRecognizer(target: self, action: #selector(tapZoomingGesture(_:)))

    tap.numberOfTapsRequired = 2

    zoomScrollView.addGestureRecognizer(tap)

    zoomScrollView.addSubview(itemImageView)

    contentView.addSubview(zoomScrollView)
}

func viewForZooming(in zoomScrollView: UIScrollView) -> UIView? {

    return itemImageView
}

func tapZoomingGesture(_ sender: UIPinchGestureRecognizer) {

    itemImageView.center = itemImageView.superview!.center

    itemImageView.transform = .identity

    zoomScrollView.frame = originalSize
}

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
    return true
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}
}

This works for me. I just noticed that I used UIPinchGestureRecognizer as the sender but for some reason it works anyway.

func tapZoomingGesture(_ sender: UIPinchGestureRecognizer) {

    let newZoomScale: CGFloat = 1.0000001

    let scrollViewSize = zoomScrollView.bounds.size

    let w = (scrollViewSize.width / newZoomScale)
    let h = (scrollViewSize.height / newZoomScale)
    let x = w / 6.0
    let y = h / 6.0

    let rectToZoomTo = CGRect(x, y, w, h)

    zoomScrollView.zoom(to: rectToZoomTo, animated: true)

    zoomScrollView.frame = itemImageView.frame

    itemImageView.center = zoomScrollView.center

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM