UIScrollView, как восстановить исходный размер после увеличения масштаба UIImageView

У меня есть представление коллекции, содержащей несколько изображений. Я могу увеличить изображение в ячейке, но я хочу, чтобы оно и вид прокрутки возвращались к исходному размеру при жесте касания. Мой жест касания восстанавливает изображение до его первоначального размера, но оно не отображается на экране, а представление прокрутки остается в увеличенном размере. Вот мой код:

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")
}
}

1 ответ

Это работает для меня. Я просто заметил, что я использовал UIPinchGestureRecognizer как отправитель, но по какой-то причине это работает в любом случае.

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

}
Другие вопросы по тегам