UIPanGestureRecognizer - ImageView возвращается в исходное положение после панорамирования - PullRequest
0 голосов
/ 24 мая 2018

Я тестирую следующий проект с использованием UIPanGestureRecognizer.Как я могу «закрепить» изображение после панорамирования?

Это то, для чего предназначен код:

(1) 2 ImageViews (image1, image2)на ViewController.Позиции определяются ограничениями.

(2) Есть 2 целевых ImageViews (target1, target2), по которым я хочу переместить image1 и image2 в.

(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 Ответ

0 голосов
/ 24 мая 2018

Проблема решена.

Я изменил настройку положения изображения1 и изображения2: (1) удалив ограничения для изображений.(2) добавив их в новом представлении и расположив их с помощью размера [инспектор> представление].

...