44207


UIPanGestureRecognizerを使って画像を動かし、対象の画像の上に移動したら位置を固定して触れなくするという画面を作っています。

＜実装したいこと＞  
（１）２つのImageView（image1, image2）を動かすことができる。  
（２）移動先のImageView（target1, target2）が２つある。  
（３）動かせる画像が移動先のどちらかのImageViewの上に重なったら、そこで場所を固定し、移動できなくする。  
重なった移動先には２つ目の画像をのせられなくする。（target1flg, target2flgで判定)  
（４）２つ目の画像を動かして、空いている方の画像に重ねることができる。  
重ねたあとは移動できなくする。

＜現在のコードの問題＞  
（３）までは動かせます。  
（４）で２つ目の画像を動かし始めると、１つ目の画像が元の場所に表示されてしまいます。

初歩的なミスではないかと思いますが、解決法を思い浮かべられず、お助けいただきたいと思います。

[code]

    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
            }      
        }
    }
    
[/code]


CC BY-SA 4.0
2018-05-23T04:39:31.943
44175
2018-05-24T04:05:34.503
2018-05-23T05:26:53.677
19110
28628
question
swift xcode
UIPanGestureRecognizer 画像を移動後に固定したい


解決しました。

image1,
image2のAutoLayoutをやめて（constraints削除）、画像をViewの中に入れ、このViewにconstraintsでレイアウトを固定。

画像はsize inspector>ViewのFrame Rectangleを設定して追加したViewの中のpositionを固定。

これで画像が元の位置に戻らなくなりました。  
ヒントをくださったOOPerさんありがとうございました。


CC BY-SA 4.0
2018-05-24T04:05:34.503
44207
2018-05-24T04:05:34.503
28628
44175
answer