UIPanGestureRecognizer - 平移后 ImageView 快速回到原始位置
UIPanGestureRecognizer - ImageView snaps back at original position after pan
我正在使用 UIPanGestureRecognizer 测试以下项目。
平移后如何 "pin" 图像?
这就是代码的用途:
(1) 2 个 ImageViews(image1, image2) 在 ViewController 上。位置由约束定义。
(2) 我想将 image1 和 image2 移动到 2 个目标 ImageViews (target1, target2)。
(3) 当我移动任意一个目标图像上的一个图像时,我希望图像停留在那里,不能再移动。另外,第二张图片不能放在填充的目标上。
(4)当我移动第二张图片时,我可以将它移动到空的目标上,图片留在那儿无法再次移动。
这段代码的问题:
此代码可以执行到第 (3) 步。
问题是,当我开始移动第二张图片时,我放在目标上的第一张图片会弹回到原来的位置。
import UIKit
class sample: UIViewController {
@IBOutlet weak var image1: UIImageView!
@IBOutlet weak var image2: UIImageView!
@IBOutlet weak var target1: UIImageView!
@IBOutlet weak var target2: UIImageView!
var target1flg: Bool!
var target2flg: Bool!
var imageViewOrigin: CGPoint!
override func viewDidLoad() {
super.viewDidLoad()
target1flg = true
target2flg = true
addPanGesture(v: image1)
addPanGesture(v: image2)
}
func addPanGesture(v: UIView) {
let pan = UIPanGestureRecognizer(target: self, action: #selector(sample.handlePan(sender:)))
v.addGestureRecognizer(pan)
}
@objc func handlePan(sender: UIPanGestureRecognizer) {
let pannedImageView = sender.view!
switch sender.state {
case .began:
imageViewOrigin = pannedImageView.frame.origin
view.bringSubview(toFront: pannedImageView)
case .changed:
moveViewWithPan(v: pannedImageView, sender: sender)
case .ended:
if pannedImageView.frame.intersects(target1.frame) && target1flg == true {
snapView(v: pannedImageView, targetBox: target1)
target1flg = false
}
else if pannedImageView.frame.intersects(target2.frame) && target2flg == true {
snapView(v: pannedImageView, targetBox: target2)
target2flg = false
}
else {
returnViewToOrigin(v: pannedImageView, loc: imageViewOrigin)
}
default:
break
}
}
func moveViewWithPan(v: UIView, sender: UIPanGestureRecognizer) {
let translation = sender.translation(in: view)
v.center = CGPoint(x: v.center.x + translation.x, y: v.center.y + translation.y)
sender.setTranslation(CGPoint.zero, in: view)
}
func returnViewToOrigin(v: UIView, loc: CGPoint) {
UIView.animate(withDuration: 0.3, animations: {
v.frame.origin = loc
})
}
func snapView(v:UIView, targetBox:UIImageView){
UIView.animate(withDuration: 0.3) {
v.center = CGPoint(x:targetBox.center.x, y: targetBox.center.y)
v.isUserInteractionEnabled = false
}
}
}
问题已解决。
我通过以下方式更改了 image1 和 image2 的位置设置:
(1)删除对图像的约束。
(2)将它们添加到一个新视图下,并使用大小[检查器>视图]定位它们。
我正在使用 UIPanGestureRecognizer 测试以下项目。 平移后如何 "pin" 图像?
这就是代码的用途:
(1) 2 个 ImageViews(image1, image2) 在 ViewController 上。位置由约束定义。
(2) 我想将 image1 和 image2 移动到 2 个目标 ImageViews (target1, target2)。
(3) 当我移动任意一个目标图像上的一个图像时,我希望图像停留在那里,不能再移动。另外,第二张图片不能放在填充的目标上。
(4)当我移动第二张图片时,我可以将它移动到空的目标上,图片留在那儿无法再次移动。
这段代码的问题:
此代码可以执行到第 (3) 步。 问题是,当我开始移动第二张图片时,我放在目标上的第一张图片会弹回到原来的位置。
import UIKit
class sample: UIViewController {
@IBOutlet weak var image1: UIImageView!
@IBOutlet weak var image2: UIImageView!
@IBOutlet weak var target1: UIImageView!
@IBOutlet weak var target2: UIImageView!
var target1flg: Bool!
var target2flg: Bool!
var imageViewOrigin: CGPoint!
override func viewDidLoad() {
super.viewDidLoad()
target1flg = true
target2flg = true
addPanGesture(v: image1)
addPanGesture(v: image2)
}
func addPanGesture(v: UIView) {
let pan = UIPanGestureRecognizer(target: self, action: #selector(sample.handlePan(sender:)))
v.addGestureRecognizer(pan)
}
@objc func handlePan(sender: UIPanGestureRecognizer) {
let pannedImageView = sender.view!
switch sender.state {
case .began:
imageViewOrigin = pannedImageView.frame.origin
view.bringSubview(toFront: pannedImageView)
case .changed:
moveViewWithPan(v: pannedImageView, sender: sender)
case .ended:
if pannedImageView.frame.intersects(target1.frame) && target1flg == true {
snapView(v: pannedImageView, targetBox: target1)
target1flg = false
}
else if pannedImageView.frame.intersects(target2.frame) && target2flg == true {
snapView(v: pannedImageView, targetBox: target2)
target2flg = false
}
else {
returnViewToOrigin(v: pannedImageView, loc: imageViewOrigin)
}
default:
break
}
}
func moveViewWithPan(v: UIView, sender: UIPanGestureRecognizer) {
let translation = sender.translation(in: view)
v.center = CGPoint(x: v.center.x + translation.x, y: v.center.y + translation.y)
sender.setTranslation(CGPoint.zero, in: view)
}
func returnViewToOrigin(v: UIView, loc: CGPoint) {
UIView.animate(withDuration: 0.3, animations: {
v.frame.origin = loc
})
}
func snapView(v:UIView, targetBox:UIImageView){
UIView.animate(withDuration: 0.3) {
v.center = CGPoint(x:targetBox.center.x, y: targetBox.center.y)
v.isUserInteractionEnabled = false
}
}
}
问题已解决。
我通过以下方式更改了 image1 和 image2 的位置设置: (1)删除对图像的约束。 (2)将它们添加到一个新视图下,并使用大小[检查器>视图]定位它们。