在iphone上,手势识别器由于某种原因无法正常工作

时间:2013-09-20 11:18:56

标签: iphone ios uilabel uigesturerecognizer

这是我制作的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];
}
}

10 个答案:

答案 0 :(得分:21)

对我来说,它有效:

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

然后:

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

[self addGestureRecognizer:tap];

答案 1 :(得分: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
}

答案 2 :(得分:4)

如果您的标签超出其超级视图的范围,触摸处理可能无法正常工作。值得一试,因为你的手势识别器代码似乎是正确的。

还有一件事要尝试:您确定要将正在添加手势识别器的代码添加到视图中吗?你打电话的时候用什么方法?

答案 3 :(得分:2)

我找到了一个很好的例子:stackoverflow link

  

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

     

使您的班级符合UIGestureRecognizerDelegate协议。

     

实例化手势识别器。例如,要实例化一个   UITapGestureRecognizer,我们会这样做:

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

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

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

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

     

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

     

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

[self.imageView addGestureRecognizer:tapGestureRecognizer];
     

将手势识别器添加到视图后,将代理设置为   手势识别器,即将处理所有的手势识别器   手势识别器的东西。在我们的示例代码中,它将是:

tapGestureRecognizer.delegate = self;
     

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

答案 4 :(得分: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
}

答案 5 :(得分:1)

gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tappedOn:)];
[self.view addGestureRecognizer:gesture];
self.UserInteractionEnabled=TRUE;

像这样添加你的方法

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

试试这个

答案 6 :(得分: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

答案 7 :(得分:0)

不确定这是否有帮助,但接收触摸事件只能使用setExclusiveTouch

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

答案 8 :(得分:0)

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

示例:


@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];

}

答案 9 :(得分:0)

我遇到了类似的令人沮丧的问题 - 解决方案是确保您的视图的父视图也启用了他们的"用户互动"属性设置为true。您可以通过IB在" View" => "相互作用"