У меня есть UITableViewCell с некоторым текстом и UIImageView.Я хотел, чтобы в UIImageView было распознавание пинч и панорамирование, имитирующее Instagram.Я действительно запутался, потому что у меня один и тот же подкласс UITableViewCell в двух разных представлениях, и они ведут себя по-разному.В одном представлении, ячейка является единственной ячейкой в первом разделе таблицы, и она отлично перемещается и сжимается.Но с другой стороны, иногда (возможно, в половине случаев), когда я зажимаю и панорамирую, UIImageView движется намного дальше и быстрее, чем мои пальцы.Точки на изображении, которые мои пальцы начинают заново, перемещаются в направлении, куда я двигаюсь, намного больше, чем мои пальцы, и изображение быстро покидает экран.Мне кажется, что последнее, если в func pan () значения перевода выше, чем должны быть, и поэтому view.center.x и view.center.y увеличиваются слишком быстро, но я не уверен, что этоэто проблема или если да, то, что вызывает это.Я не могу точно воспроизвести проблему, поэтому у меня возникают проблемы с получением большого количества информации.Я использовал этот урок , чтобы создавать жесты панорамирования и пинчинга.Ниже приведен фрагмент моего кода.Любая помощь будет оценена.Я сбит с толку.
UITableViewCell:
var isZooming = false
var originalImageCenter: CGPoint?
var secondaryImageCenter: CGPoint?
var accessibleScale: CGFloat = 1 {
didSet {
panScale = accessibleScale
}
}
var panScale: CGFloat = 1
func configureData(image: UIImage?, secondaryImage: UIImage?, exerciseName: String?, explanation: String?) {
let pinch = UIPinchGestureRecognizer(target: self, action: #selector(self.pinch(sender:)))
let secondaryPinch = UIPinchGestureRecognizer(target: self, action: #selector(self.pinch(sender:)))
self.exerciseImageView.addGestureRecognizer(pinch)
self.secondaryImageView.addGestureRecognizer(secondaryPinch)
let pan = UIPanGestureRecognizer(target: self, action: #selector(self.pan(sender:)))
let secondaryPan = UIPanGestureRecognizer(target: self, action: #selector(self.pan(sender:)))
pan.delegate = self
secondaryPan.delegate = self
self.exerciseImageView.addGestureRecognizer(pan)
self.secondaryImageView.addGestureRecognizer(secondaryPan)
}
@objc func pinch(sender:UIPinchGestureRecognizer) {
guard let senderView = sender.view as! UIImageView? else {
return
}
let currentScale = senderView.frame.size.width / senderView.bounds.size.width
var newScale = currentScale * sender.scale
accessibleScale = newScale
if sender.state == .began {
if newScale > 1 {
self.isZooming = true
}
} else if sender.state == .changed {
senderView.layer.zPosition = 1
let pinchCenter = CGPoint(x: sender.location(in: senderView).x - senderView.bounds.midX,
y: sender.location(in: senderView).y - senderView.bounds.midY)
let transform = senderView.transform.translatedBy(x: pinchCenter.x, y: pinchCenter.y)
.scaledBy(x: sender.scale, y: sender.scale)
.translatedBy(x: -pinchCenter.x, y: -pinchCenter.y)
if newScale < 1 {
newScale = 1
let transform = CGAffineTransform(scaleX: newScale, y: newScale)
senderView.transform = transform
sender.scale = 1
} else {
senderView.transform = transform
sender.scale = 1
}
} else if sender.state == .ended || sender.state == .failed || sender.state == .cancelled {
if senderView == exerciseImageView {
guard let center = self.originalImageCenter else {return}
UIView.animate(withDuration: 0.3, animations: {
senderView.transform = CGAffineTransform.identity
senderView.center = center
}) { (bool) in
senderView.layer.zPosition = 0
self.isZooming = false
}
} else {
guard let center = self.secondaryImageCenter else {return}
UIView.animate(withDuration: 0.3, animations: {
senderView.transform = CGAffineTransform.identity
senderView.center = center
}) { (bool) in
senderView.layer.zPosition = 0
self.isZooming = false
}
}
}
}
@objc func pan(sender: UIPanGestureRecognizer) {
guard let senderView = sender.view as! UIImageView? else {
return
}
print(sender.translation(in: self))
if self.isZooming && sender.state == .began {
if sender.view == exerciseImageView {
self.originalImageCenter = sender.view?.center
} else {
self.secondaryImageCenter = sender.view?.center
}
} else if self.isZooming && sender.state == .changed {
let translation = sender.translation(in: self)
if let view = sender.view {
view.center = CGPoint(x:view.center.x + translation.x,
y:view.center.y + translation.y )
}
sender.setTranslation(CGPoint.zero, in: senderView.superview)
}
}