我正在开展一个项目,其中正在屏幕上绘制Tic Tac Toe网格。
问题是,对于" tile"的底行,UITapGestureRecognizer
无法正常工作。对于网格的前两行,当分配识别器所分配的UIImageView
的任何部分时,将调用正确的函数。但是,对于底行,它仅在点击UIImageView
的最顶部时才有效。
以下是代码:
func drawTiles() {
for view in subviews {
if (view as? UIImageView != nil) {
view.removeFromSuperview()
}
}
// Upper Left Tile [0][0]
var view = UIImageView(image: battleGround.tiles[0][0].image)
view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(upperLeftTapped)))
view.isUserInteractionEnabled = true
view.frame = CGRect(x: frame.minX, y: frame.minY, width: frame.width / 3, height: frame.height / 3)
addSubview(view)
// Upper Middle Tile [0][1]
view = UIImageView(image: battleGround.tiles[0][1].image)
view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(upperCenterTapped)))
view.isUserInteractionEnabled = true
view.frame = CGRect(x: frame.minX + frame.width / 3, y: frame.minY, width: frame.width / 3, height: frame.height / 3)
addSubview(view)
// Upper Right Tile [0][2]
view = UIImageView(image: battleGround.tiles[0][2].image)
view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(upperRightTapped)))
view.isUserInteractionEnabled = true
view.frame = CGRect(x: frame.minX + ((frame.width / 3) * 2), y: frame.minY, width: frame.width / 3, height: frame.height / 3)
addSubview(view)
// Middle Left Tile [1][0]
view = UIImageView(image: battleGround.tiles[1][0].image)
view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(middleLeftTapped)))
view.isUserInteractionEnabled = true
view.frame = CGRect(x: frame.minX, y: frame.minY + ((frame.height / 3)), width: frame.width / 3, height: frame.height / 3)
addSubview(view)
// Middle Center Tile [1][1]
view = UIImageView(image: battleGround.tiles[1][1].image)
view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(middleCenterTapped)))
view.isUserInteractionEnabled = true
view.frame = CGRect(x: frame.minX + ((frame.width / 3)), y: frame.minY + ((frame.height / 3)), width: frame.width / 3, height: frame.height / 3)
addSubview(view)
// Middle Center Tile [1][2]
view = UIImageView(image: battleGround.tiles[1][2].image)
view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(middleRightTapped)))
view.isUserInteractionEnabled = true
view.frame = CGRect(x: frame.minX + ((frame.width / 3) * 2), y: frame.minY + ((frame.height / 3)), width: frame.width / 3, height: frame.height / 3)
addSubview(view)
// FIXME: Only clicking the top of the next 3 views works
// Lower Left Tile [2][0]
view = UIImageView(image: battleGround.tiles[2][0].image)
view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(lowerLeftTapped)))
view.isUserInteractionEnabled = true
view.frame = CGRect(x: frame.minX, y: frame.minY + ((frame.height / 3) * 2), width: frame.width / 3, height: frame.height / 3)
addSubview(view)
// Lower Center Tile [2][1]
view = UIImageView(image: battleGround.tiles[2][1].image)
view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(lowerCenterTapped)))
view.isUserInteractionEnabled = true
view.frame = CGRect(x: frame.minX + ((frame.width / 3)), y: frame.minY + ((frame.height / 3) * 2), width: frame.width / 3, height: frame.height / 3)
addSubview(view)
// Lower Right Tile [2][2]
view = UIImageView(image: battleGround.tiles[2][2].image)
view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(lowerRightTapped)))
view.isUserInteractionEnabled = true
view.frame = CGRect(x: frame.minX + ((frame.width / 3) * 2), y: frame.minY + ((frame.height / 3) * 2), width: frame.width / 3, height:frame.height / 3)
addSubview(view)
}
func upperLeftTapped() {
tapped(row: 0, column: 0)
}
func upperCenterTapped(){
tapped(row: 0, column: 1)
}
func upperRightTapped() {
tapped(row: 0, column: 2)
}
func middleLeftTapped() {
tapped(row: 1, column: 0)
}
func middleCenterTapped() {
tapped(row: 1, column: 1)
}
func middleRightTapped() {
tapped(row: 1, column: 2)
}
func lowerLeftTapped() {
tapped(row: 2, column: 0)
}
func lowerCenterTapped() {
tapped(row: 2, column: 1)
}
func lowerRightTapped() {
tapped(row: 2, column: 2)
}
func tapped(row: Int, column: Int) {
if (battleGround.tiles[row][column] == .empty) {
battleGround.tiles[row][column] = currentPlayer
drawTiles()
}
}
这是要注意的代码(绘制网格的下一行的内容)
// Lower Left Tile [2][0]
view = UIImageView(image: battleGround.tiles[2][0].image)
view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(lowerLeftTapped)))
view.isUserInteractionEnabled = true
view.frame = CGRect(x: frame.minX, y: frame.minY + ((frame.height / 3) * 2), width: frame.width / 3, height: frame.height / 3)
addSubview(view)
// Lower Center Tile [2][1]
view = UIImageView(image: battleGround.tiles[2][1].image)
view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(lowerCenterTapped)))
view.isUserInteractionEnabled = true
view.frame = CGRect(x: frame.minX + ((frame.width / 3)), y: frame.minY + ((frame.height / 3) * 2), width: frame.width / 3, height: frame.height / 3)
addSubview(view)
// Lower Right Tile [2][2]
view = UIImageView(image: battleGround.tiles[2][2].image)
view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(lowerRightTapped)))
view.isUserInteractionEnabled = true
view.frame = CGRect(x: frame.minX + ((frame.width / 3) * 2), y: frame.minY + ((frame.height / 3) * 2), width: frame.width / 3, height:frame.height / 3)
addSubview(view)
编辑:以下是该应用运行的一些截图,可以更好地了解问题所在。
此屏幕截图显示了空网格的外观。
此屏幕截图显示了我点击网格顶部中间和左侧中间区域后的网格。如您所见,图像已正确添加。
但是,如果我点击网格的底行,则没有任何反应。看看这个GIF:
我多次敲击底部中间,没有任何反应。然而,在中心接听工作正常。
这是一个有趣的部分:点击相同底部中间图块的顶部会导致图像出现。看看:
非常感谢任何帮助!
答案 0 :(得分:1)
使用调试 - >查看调试 - >捕获视图层次结构,并检查您将所有这些切片插入实际延伸的视图,直到您认为它为止。
使用self.clipsToBounds = YES;
进行简单测试
如果您无法看到所有图块,则包含的视图不够大,这意味着手势无法正确转发到手势识别器。
答案 1 :(得分:0)
您的视图可能与其他视图重叠。钉枪是正确的,只需使用查看调试解决此问题,您可以看到哪个视图与您的视图重叠并修复它。
答案 2 :(得分:0)
clipToBounds
方法帮助我找到了解决方案,但没有彻底透露。经过几周的审议后,事实证明用frame.
替换大部分bounds.
可以解决问题。这是新代码。
func drawTiles() {
for view in subviews {
if (view as? UIImageView != nil) {
view.removeFromSuperview()
}
}
// Upper Left Tile [0][0]
var view = UIImageView(image: battleGround.tiles[0][0].image)
view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(upperLeftTapped)))
view.isUserInteractionEnabled = true
view.frame = CGRect(x: bounds.minX, y: bounds.minY, width: bounds.width / 3, height: bounds.height / 3)
addSubview(view)
// Upper Middle Tile [0][1]
view = UIImageView(image: battleGround.tiles[0][1].image)
view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(upperCenterTapped)))
view.isUserInteractionEnabled = true
view.frame = CGRect(x: bounds.minX + bounds.width / 3, y: bounds.minY, width: bounds.width / 3, height: bounds.height / 3)
addSubview(view)
// Upper Right Tile [0][2]
view = UIImageView(image: battleGround.tiles[0][2].image)
view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(upperRightTapped)))
view.isUserInteractionEnabled = true
view.frame = CGRect(x: bounds.minX + ((bounds.width / 3) * 2), y: bounds.minY, width: bounds.width / 3, height: bounds.height / 3)
addSubview(view)
// Middle Left Tile [1][0]
view = UIImageView(image: battleGround.tiles[1][0].image)
view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(middleLeftTapped)))
view.isUserInteractionEnabled = true
view.frame = CGRect(x: bounds.minX, y: bounds.minY + ((bounds.height / 3)), width: bounds.width / 3, height: bounds.height / 3)
addSubview(view)
// Middle Center Tile [1][1]
view = UIImageView(image: battleGround.tiles[1][1].image)
view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(middleCenterTapped)))
view.isUserInteractionEnabled = true
view.frame = CGRect(x: bounds.minX + ((bounds.width / 3)), y: bounds.minY + ((bounds.height / 3)), width: bounds.width / 3, height: bounds.height / 3)
addSubview(view)
// Middle Center Tile [1][2]
view = UIImageView(image: battleGround.tiles[1][2].image)
view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(middleRightTapped)))
view.isUserInteractionEnabled = true
view.frame = CGRect(x: bounds.minX + ((bounds.width / 3) * 2), y: bounds.minY + ((bounds.height / 3)), width: bounds.width / 3, height: bounds.height / 3)
addSubview(view)
// FIXME: Only clicking the top of the next 3 views works
// Lower Left Tile [2][0]
view = UIImageView(image: battleGround.tiles[2][0].image)
view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(lowerLeftTapped)))
view.isUserInteractionEnabled = true
view.frame = CGRect(x: bounds.minX, y: bounds.minY + ((bounds.height / 3) * 2), width: bounds.width / 3, height: bounds.height / 3)
addSubview(view)
// Lower Center Tile [2][1]
view = UIImageView(image: battleGround.tiles[2][1].image)
view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(lowerCenterTapped)))
view.isUserInteractionEnabled = true
view.frame = CGRect(x: bounds.minX + ((bounds.width / 3)), y: bounds.minY + ((bounds.height / 3) * 2), width: bounds.width / 3, height: bounds.height / 3)
addSubview(view)
// Lower Right Tile [2][2]
view = UIImageView(image: battleGround.tiles[2][2].image)
view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(lowerRightTapped)))
view.isUserInteractionEnabled = true
view.frame = CGRect(x: bounds.minX + ((bounds.width / 3) * 2), y: bounds.minY + ((bounds.height / 3) * 2), width: bounds.width / 3, height:bounds.height / 3)
addSubview(view)
}