我正在制作一个项目,其中的一个井字格正在屏幕上绘制。iOS UIImageView水龙头只在视图顶部注册
问题是,对于“瓷砖”的底部行,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:
我拍了拍底部中间多次的,什么都没有发生。然而在中心窃听正常工作。
以下是有趣的部分:在相同的底部中部瓷砖的顶部轻敲会导致图像出现。请看:
任何帮助将不胜感激!
正如您所说,使用'clipToBounds = true'显示截断点。任何想法如何我会去解决这个问题? –
理想情况下,您可以使用自动布局来布置使用NSLayoutConstraint的视图。但是,您可能更容易计算超视图的框架,并明确设置框架。 – Nailer
使用界面构建器,您也可以直接在此处创建此布局,而不是通过编程方式构建界面。无论哪种方式,你会学到很多:) – Nailer