UIPanGestureRecognizer - ImageView 在平移后快速回到原始位置

Posted

技术标签:

【中文标题】UIPanGestureRecognizer - ImageView 在平移后快速回到原始位置【英文标题】:UIPanGestureRecognizer - ImageView snaps back at original position after pan 【发布时间】:2018-05-24 03:04:27 【问题描述】:

我正在使用 UIPanGestureRecognizer 测试以下项目。 平移后如何“固定”图像?

这就是代码的目的:

(1) 2 个 ImageViews(image1, image2) 在 ViewController 上。位置由约束定义。

(2) 我想将 image1 和 image2 移动到 2 个目标 ImageView (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
              
    

【问题讨论】:

【参考方案1】:

问题已解决。

我通过以下方式更改了 image1 和 image2 的位置设置: (1) 删除图像的约束。 (2) 将它们添加到新视图下并使用大小 [inspector > View] 定位它们。

【讨论】:

以上是关于UIPanGestureRecognizer - ImageView 在平移后快速回到原始位置的主要内容,如果未能解决你的问题,请参考以下文章

如何在父视图中限制 UIPanGestureRecognizer

UIPanGestureRecognizer 干扰滚动

未调用 iOS 13 UIPanGestureRecognizer 选择器

Swift:获取 UIPanGestureRecognizer 的目标

当对象移动到某个帧时如何停止 UIPanGestureRecognizer

在父 UIView 中移动 UIView (UIPanGestureRecognizer)