如何删除特定区域的手势识别器?井字游戏
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)
}
}
}
}
请注意,这不是最佳解决方案,您应该能够将 logic 与 view 分开,但对于您的问题, 这样就可以了。
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.
我只使用一个 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)
}
}
}
}
请注意,这不是最佳解决方案,您应该能够将 logic 与 view 分开,但对于您的问题, 这样就可以了。
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.