禁用手势识别器

11

我有一个简单的记忆游戏。 但我想关闭触摸功能。

当我使用 imageViewGurka1.gestureRecognizers=NO; 时,它可以工作,但是我会收到警告信息:Initialization of pointer of type 'NSArray *' to null from a constant boolean expression。(我该如何解决这个警告信息?)

如果我使用 imageViewGurka1 setUserInteractionEnable:NO;,我就不会收到警告信息,但我将无法再移动图像了。

以下是一些代码。

-(IBAction)handleTapGurka1:(UIGestureRecognizer *)sender {

if (imageViewGurka1.tag == 0) {
    [imageViewGurka1 setImage:[UIImage imageNamed:@"memorySångerGurka.png"]];
    imageViewGurka1.tag=1;
    [self.view bringSubviewToFront:imageViewGurka1];

}

else {
    [imageViewGurka1 setImage:[UIImage imageNamed:@"memorySångerBaksida.png"]];
    imageViewGurka1.tag=0;
    [self.view bringSubviewToFront:imageViewGurka1];
}

if (imageViewGurka1.tag==1 && imageViewGurka2.tag==1) {
    NSURL *musicFile;
    musicFile = [NSURL fileURLWithPath:
                 [[NSBundle mainBundle]
                  pathForResource:@"applader"
                  ofType:@"mp3"]];
    myAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:musicFile error:nil];
    [myAudio play];
    //[imageViewGurka1 setUserInteractionEnabled:NO];
    //[imageViewGurka2 setUserInteractionEnabled:NO];
    imageViewGurka1.gestureRecognizers=NO;
    imageViewGurka2.gestureRecognizers=NO;
}

}

感谢任何帮助!

问候


“gestureRecognizers”并不是一个布尔值(正如错误所述),也没有尝试查阅UIGestureRecognizer文档,其中答案非常明显。 - matt
4个回答

16

gestureRecognizers 是一个数组,包含了所有附加到视图的手势识别器。你应该遍历该数组中的所有手势识别器,并将它们的 enabled 属性设置为 false ,如下所示:

```swift for recognizer in view.gestureRecognizers ?? [] { recognizer.isEnabled = false } ```
for (UIGestureRecognizer * g in imageViewGurka1.gestureRecognizers) {
    g.enabled = NO;
}

Swift 5

以下是 Swift 5 的等效版本。

for gesture in imageViewGurka1.gestureRecognizers! {
    gesture.isEnabled = false
}

如果我把这段代码放在 [myAudio play]; 之后,就会出现错误信息:"Expected '(' after for'" …… 我应该把 "( )" 放哪里呢?感谢您的帮助! - user3266053
啊,抱歉犯了个错误。我之前用的是Swift写的答案,而不是Obj-C。现在我已经改成Obj-C了。但如果你分辨不出两者的区别,那么在尝试开发应用之前,你应该先学习这门语言。 - Cihan Tek
谢谢你的帮助。我是这样做的。 对于imageViewGurka1.gestureRecognizers中的每个UIGestureRecognizer *Gurka1,都会执行以下操作: Gurka1.enabled = NO;对于imageViewGurka2.gestureRecognizers中的每个UIGestureRecognizer *Gurka2,都会执行以下操作: Gurka2.enabled = NO; - user3266053
没错,我忘了*运算符。当你不停地在两种不同的语言之间切换时就会发生这种情况 :) 请接受答案。 - Cihan Tek
接受答案?我在哪里可以做到这一点? - user3266053
这篇文章左侧有一个勾选标志(打钩),只需点击它并将其变为绿色即可 :) - Cihan Tek

6

在Swift4中,对于许多视图上的许多手势,您可以像这样启用和禁用手势。

假设我们有一个UIView数组,并且我们想要禁用第一个添加到view数组中名为ourView的第一个视图的手势。

   ourView[0].gestureRecognizers![0].isEnabled = false

同时,您可以像这样启用或禁用所有手势。
   for k in 0..<ourView.count {
      for l in 0..<outView[k].gestureRecognizers.count {
         ourView[k].gestureRecognizers![l].isEnabled = false 
      }
   }

4

Storyboard/Outlet解决方案

背景: 我有一个UIView,希望它像一个按钮一样起作用,所以我添加了一个tap gesture recognizer(点击手势识别器)到它上面。当用户点击“按钮”时,我想禁用该按钮,执行一些动画,然后在动画完成后重新启用该按钮。

解决方案: 如果您正在使用storyboard,并且已经将一个gesture recognizer(手势识别器)添加到UIView中,那么您可以从gesture recognizer(手势识别器)中控制+拖动到assistant editor中创建outlet(出口)。然后,您可以设置gestureRecognizerName.isEnabled = false

@IBOutlet var customButtonGestureRecognizer: UITapGestureRecognizer!

@IBAction func didTapCustomButton(_ sender: Any) {
    customButtonGestureRecognizer.isEnabled = false
    performSomeAnimation(completionHandler: {
        self.customButtonGestureRecognizer.isEnabled = true
    })
}

enter image description here


0

根据苹果的文档,你也可以使用以下方法:

func removeTarget(Any?, action: Selector?)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接