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
}