18259


下記コードで、for文で15個のpiece(UIImageView)に対して、addGestureRecognizerでGestureを設定しているのですが、最後のpieceにだけGestureが設定されており、他には設定されまえせん。特にエラーも発生せず困っております。なぜでしょうか？

[code]

    import UIKit
    
    class ViewController: UIViewController {
    
        var board: UIView!
        var piece: UIImageView!
    
        enum Direction {
            case Left, Right, Up, Down, NG
        }
    
        let PieceSize: Int = 70
        var empty: Int = 15
        var panning : Bool = false
        var pieceX: CGFloat = 0
        var pieceY: CGFloat = 0
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            board = UIView(frame: CGRectMake(0, 0, CGFloat(PieceSize * 4), CGFloat(PieceSize * 4)))
            board.center = view.center
            board.backgroundColor = UIColor.grayColor()
            board.layer.borderColor = UIColor.blackColor().CGColor
            board.layer.borderWidth = 1.0
            view.addSubview(board)
    
            let panGesture = UIPanGestureRecognizer(target: self, action: "pan:")
    
            for i in 0...14 {
                pieceX = CGFloat(i % 4 * PieceSize)
    
                if i < 4 {
                    pieceY = CGFloat(0)
                } else if i > 3 && i < 8 {
                    pieceY = CGFloat(PieceSize)
                } else if i > 7 && i < 12 {
                    pieceY = CGFloat(PieceSize * 2)
                } else if i > 11 {
                    pieceY = CGFloat(PieceSize * 3)
                }
    
                piece = UIImageView(frame: CGRectMake(pieceX, pieceY, CGFloat(PieceSize), CGFloat(PieceSize)))
                piece.image = UIImage(named: i.description + ".png")
                piece.userInteractionEnabled = true
                piece.tag = i
                piece.addGestureRecognizer(panGesture)
                board.addSubview(piece)
            }
    
            for view in board.subviews {
                print(view)
            }
    
        }
    
        func movePiece(aPiece: UIImageView) {
            if isMovable(aPiece.tag) != Direction.NG {
    
                // ピースを移動する
                var newFrame = CGRectMake(0, 0, CGFloat(PieceSize), CGFloat(PieceSize))
                newFrame.origin.x = CGFloat(PieceSize * (empty % 4))
                newFrame.origin.y = CGFloat(PieceSize * (empty / 4))
                aPiece.frame  = newFrame
    
                // 空白位置の入れ替え
                let oldEmpty = empty
                empty = aPiece.tag
                aPiece.tag = oldEmpty
            }
        }
    
        func pan(gesture: UIPanGestureRecognizer) {
            let aPiece = gesture.view as! UIImageView
            let direction = isMovable(aPiece.tag)
    
            if (direction != .NG) {
                if (gesture.state == UIGestureRecognizerState.Changed) || (gesture.state == UIGestureRecognizerState.Ended) {
                let translation = gesture.translationInView(aPiece)
    
                // 空白位置の方向に応じて動かす方向を限定する
                if (direction == .Left) && (translation.x < 0) {
                    // 左に動かす
                    panning = true
                    aPiece.center.x = aPiece.center.x + translation.x
    
                } else if (direction == .Right) && (translation.x > 0) {
                    // 右方向に動かす
                    panning = true
                    aPiece.center.x = aPiece.center.x + translation.x
    
                } else if (direction == .Up) && (translation.y < 0) {
                    // 上方向に動かす
                    panning = true
                    aPiece.center.y = aPiece.center.y + translation.y
    
                } else if (direction == .Down) && (translation.y > 0) {
                    // 下方向に動かす
                    panning = true
                    aPiece.center.y = aPiece.center.y + translation.y
                }
    
                // 移動距離をリセット
                gesture.setTranslation(CGPointZero, inView: aPiece)
                }
            }
    
            // パンが完了したらピースを移動
            if gesture.state == UIGestureRecognizerState.Ended {
                if panning {
                movePiece(aPiece)
                }
                panning = false
            }
        }
    
        func isMovable(tapPos: Int) -> Direction {
            var result: Direction = .NG
    
            if empty == tapPos + 4 {
                // 下に移動
                result = .Down
            } else if empty == tapPos - 4 {
                // 上に移動
                result = .Up
            } else if empty == (tapPos - 1) && (tapPos % 4) != 0 {
                // 左に移動
                result = .Left
            } else if empty == (tapPos + 1) && (tapPos % 4) != 3 {
                // 右に移動
                result = .Right
            }
    
            return result
        }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
        }
    }
    
[/code]


CC BY-SA 3.0
2015-10-30T13:10:45.597
18252
2015-10-30T19:49:22.390
2015-10-30T13:16:34.793
question
ios swift xcode
addGestureRecognizerが設定されない


どこかに説明があったはずだと思って探してみたのですが、直接的な説明は見つけられませんでした…^^;

ただ `UIGestureRecognizer`
は、それが追加された特定のビュー上のタッチを判定するものなので、ひとつのインスタンスを複数のビューに追加することはできません。

別のビューに追加すると、もともと追加されていたビューからは自動で削除されます。


CC BY-SA 3.0
2015-10-30T19:49:22.390
18259
2015-10-30T19:49:22.390
2299
18252
answer