10

这是我制作的 UILabel 子类,但它似乎不起作用。出于某种原因,它不会调用“tappedOn”。

gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tappedOn)];
[self addGestureRecognizer:gesture];
[self setUserInteractionEnabled:YES];

你知道为什么会这样吗?

这是 tappedOn 方法:

-(void)tappedOn
{

NSLog(@"tapped");
if ([self.type isEqualToString: @"load"])
{
    [self.manager.manager loadSavedGameInRow:self.name];
}

if ([self.type isEqualToString: @"save"])
{
    [self.manager.manager saveGameInRow:self.name];
}
}
4

10 回答 10

22

对我来说它有效:

首先设置这个: [self setUserInteractionEnabled:YES];

然后:

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(method:)];
tap.numberOfTapsRequired = 1;

[self addGestureRecognizer:tap];
于 2013-09-20T12:26:20.500 回答
4

如果您的标签超出其父视图的范围,则触摸处理可能不起作用。值得一试,因为您的手势识别器代码似乎正确。

还有一件事要尝试:您确定将手势识别器添加到视图的代码正在运行吗?当你调用它时,你是什么方法?

于 2013-09-20T12:44:55.530 回答
4

我为我的项目尝试了这段代码,它对我来说工作正常。

UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGestureUpdated:)];
    tapGesture.delegate = self;
    tapGesture.numberOfTapsRequired = 1;
    tapGesture.numberOfTouchesRequired = 1;
    tapGesture.cancelsTouchesInView = NO;
    [[self view] addGestureRecognizer:tapGesture];

- (IBAction)tapGestureUpdated:(UIGestureRecognizer *)recognizer
{
    // Code to respond to gesture here
}
于 2013-09-20T11:32:22.083 回答
2

我为你找到了一个很好的例子:stackoverflow 链接

这是有关如何在课堂上实现手势识别器的分步指南:

使您的课程符合UIGestureRecognizerDelegate协议。

实例化手势识别器。例如,要实例化 a UITapGestureRecognizer,我们将执行以下操作:

UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapFrom:)];

在这里,action 是处理手势的选择器。在这里,我们的选择器 handleTapFrom 看起来像:

- (void) handleTapFrom: (UITapGestureRecognizer *)recognizer
{
    //Code to handle the gesture
}

选择器的参数是手势识别器。我们可以使用这个手势识别器来访问它的属性,例如,我们可以找到手势识别器的状态,比如, UIGestureRecognizerStateBegan,UIGestureRecognizerStateEnded等。

在实例化的手势识别器上设置所需的属性。例如,对于 a UITapGestureRecognizer,我们可以设置属性 numberOfTapsRequirednumberOfTouchesRequired

将手势识别器添加到要检测手势的视图中。在我们的示例代码中(我将分享该代码供您参考),我们将使用以下代码行将手势识别器添加到 imageView:

[self.imageView addGestureRecognizer:tapGestureRecognizer];

将手势识别器添加到视图后,设置手势识别器的委托,即处理所有手势识别器内容的类。在我们的示例代码中,它会像:

tapGestureRecognizer.delegate = self;

注意:在将手势识别器添加到视图后分配委托。否则,将不会调用 action 方法。

于 2013-09-20T12:19:33.543 回答
2

尝试这个:

func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool {

    return true

}

我使用 Swift 是因为我不熟悉 ObjC。返回true保证允许同时识别。

有时您可能想要设置一些约束以避免冲突,例如:

func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    if gestureRecognizer == singleTapShowHideRecognizer {
        return true
    }
    return false
}
于 2016-04-23T13:24:46.917 回答
1

看起来应该是有序的...但是您是否忘记了“手势”前面的类型?请参见下文,并注意代码前添加的UITapGestureRecognizer

UITapGestureRecognizer *gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tappedOn)];
[self addGestureRecognizer:gesture];
[self setUserInteractionEnabled:YES];

有关更多信息,请参阅this answer about how to make a label clickable

于 2014-07-24T22:34:16.220 回答
1
gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tappedOn:)];
[self.view addGestureRecognizer:gesture];
self.UserInteractionEnabled=TRUE;

像这样添加您的方法

- (void) tappedOn:(UIGestureRecognizer*)sender
{
}

试试这个

于 2013-09-20T11:21:53.550 回答
0

不确定这是否有帮助,但要专门接收触摸事件,请使用setExclusiveTouch

gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tappedOn)];
[self addGestureRecognizer:gesture];
[self setUserInteractionEnabled:YES];
[self setExclusiveTouch:YES];
于 2013-09-20T11:28:39.587 回答
0

它应该工作。您似乎在标签子类代码中添加了手势。你确定你同时加入了 initWithFrame: 和 initWithCoder: 方法吗?因为可以根据您使用 XIB 或以编程方式实例化标签这一事实独立调用两个 init。

例子:


@implementation MyLabel

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        [self addGesture];
   }
    return self;
}

-(id)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];
    if(self) {
        [self addGesture];
    }
    return self;
}

-(void)addGesture {
    UITapGestureRecognizer *_g = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(myTap:)];
    [self addGestureRecognizer:_g];
    [self setUserInteractionEnabled:YES];

}

于 2013-09-20T11:31:17.927 回答
0

我遇到过类似的令人沮丧的问题 - 解决方案是确保您的视图的父视图也将其“用户交互启用”属性设置为 true。您可以通过“查看”=>“交互”下的 IB 进行设置。

于 2016-02-17T23:12:10.037 回答