Я хочу перетащить изображение по центру с помощью распознавателя жестов и хочу снова перецентрировать его, когда оно больше не перетаскивается.
1) Создать виртуальный канал с ImageView
2) Ограничить его до 20 со всех сторон (я использую контроллер табуляции, чтобы 20 пикселей от верхней части контроллера были бы еще лучше)
3) Установите его в Aspect Fit
4)Создать розетку для вашего VC
5) Добавить распознаватель жестов в ImageView
let gesture = UIPanGestureRecognizer(target: self, action: #selector(imageDragged(gestureRecognizer:)))
matchImageView.addGestureRecognizer(gesture)
6) Создать функцию imageDragged
@objc func imageDragged(gestureRecognizer: UIPanGestureRecognizer){
//Current Point where the label is dragged
let draggedLabelPoint = gestureRecognizer.translation(in: view)
//Updating the center of the label : viewcenter +/- currentpoint
matchImageView.center = CGPoint(x: view.bounds.width/2 + draggedLabelPoint.x, y: view.bounds.height/2 + draggedLabelPoint.y)
let xFromCenter = view.bounds.width/2 - matchImageView.center.x
var rotation = CGAffineTransform(rotationAngle: xFromCenter / -500)
let scale = min(100/abs(xFromCenter),1)
var scaledAndRotated = rotation.scaledBy(x: scale, y: scale)
//Transforming the Item respective to the distance from center
matchImageView.transform = scaledAndRotated
if gestureRecognizer.state == .ended {
//If Image is out of bounds -> left
if matchImageView.center.x < (view.bounds.width/2 - 120) {
matchImageView.alpha = 0
}
//If Image is out of bounds -> right
if matchImageView.center.x > (view.bounds.width/2 + 120) {
matchImageView.alpha = 0
}
//Reset the scaling variables and recentering the Item after swipe
rotation = CGAffineTransform(rotationAngle: 0)
scaledAndRotated = rotation.scaledBy(x: 1, y: 1)
matchImageView.transform = scaledAndRotated
matchImageView.center = CGPoint(x: view.bounds.width/2, y: view.bounds.height/2)
7) Протестировать эту функцию с другой сторонысоотношение изображений
Когда я нажимаю на изображение и перетаскиваю его чуть-чуть, чтобы распознаватель жестов распознал движение, просмотр изображения выскакивает на несколько пикселей.Я думаю, что интенсивность этого привязки также зависит от пропорции исходного изображения.
Изображение всегда должно быть центрировано внутри полезного вида, и, независимо от соотношения сторон, не должно быть расхождений междуцентральные точки.
Я пытался создать переменную смещения, чтобы сгладить ее, но невозможно сузить этот размер на глаз.