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