如何删除特定区域的手势识别器?井字游戏

How to remove gesture recognizer in specific area? TicTacToe

我只使用一个 tapGesture Recognizer 并说如果它在某个标签内被点击然后更改文本。但是,在点击它之后,我不希望标签文本能够被更改。这是函数:

@IBAction func onTapped(sender: UITapGestureRecognizer) {
        print("Here")
        let selectedPoint = sender.locationInView(self.view)
        print(selectedPoint)
        for label in labelArray{
            if CGRectContainsPoint(label1.frame, selectedPoint){
                label1.text = String(currentLetter)
            }
            else{
                label1.userInteractionEnabled = false
            }
            if CGRectContainsPoint(label2.frame, selectedPoint){
                label2.text = String(currentLetter)

            }
            if CGRectContainsPoint(label3.frame, selectedPoint){
                label3.text = String(currentLetter)


            }
            if CGRectContainsPoint(label4.frame, selectedPoint){
                label4.text = String(currentLetter)


            }
            if CGRectContainsPoint(label5.frame, selectedPoint){
                label5.text = String(currentLetter)
            }
            if CGRectContainsPoint(label6.frame, selectedPoint){
                label6.text = String(currentLetter)

            }
            if CGRectContainsPoint(label7.frame, selectedPoint){
                label7.text = String(currentLetter)

            }
            if CGRectContainsPoint(label8.frame, selectedPoint){
                label8.text = String(currentLetter)

            }
            if CGRectContainsPoint(label9.frame, selectedPoint){
                label9.text = String(currentLetter)

            }
            if CGRectContainsPoint(label10.frame, selectedPoint){
                label10.text = String(currentLetter)


            }
        }

}

您可以为 class 中的 UITapGestureRecognizer 创建一个 @IBOutlet 并在某些情况下禁用用户交互,在您的情况下,它进入您的 if 子句使用 属性 enabled 这会禁用 UITapGestureRecognizer.

中的滑动交互

类似这样的代码:

@IBOutlet var tapGesture: UITapGestureRecognizer!

@IBAction func onTapped(sender: UITapGestureRecognizer) {
   if condition {
        self.tapGesture.enabled = false
   } 
}

希望对你有所帮助。

您这样做的方式似乎并不是实现此目的的好方法,但是,如果您在设置文本后立即为标签停用用户交互,我想你已经完成了。由于这个视图在另一个视图之上,不会让父视图了解该手势。

But, that's not how things works

例如:

/.../
if CGRectContainsPoint(label9.frame, selectedPoint){
                label9.text = String(currentLetter)
                label9.userInteractionEnabled = false
            }
/.../

什么都不做,相反,这可能是更好的方法:

@IBAction func onTapped(sender: UITapGestureRecognizer) {
        let selectedPoint = sender.locationInView(self.view)
        for label in labelArray {
            if CGRectContainsPoint(label.frame, selectedPoint){
                if label.text == "" {
                   label.text = String(currentLetter)
                }
            }
        }
}

请注意,这不是最佳解决方案,您应该能够将 logicview 分开,但对于您的问题, 这样就可以了。

FOOTNOTE:

Notice that in your code, your are traversing an array of labels, but you are not using the label identifier, take a close look at how you should be using it.