这是我制作的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];
}
}
答案 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 }
选择器的参数是手势识别器。我们可以用 这个手势识别器可以访问它的属性,例如,我们可以 找到手势识别器的状态,比如
UIGestureRecognizerStateBegan
,UIGestureRecognizerStateEnded
等在实例化的手势识别器上设置所需的属性。对于 例如,对于
UITapGestureRecognizer
,我们可以设置属性numberOfTapsRequired
和numberOfTouchesRequired
。将手势识别器添加到要检测手势的视图中 对于。在我们的示例代码中(我将为您分享该代码) 参考),我们将添加手势识别器到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];
答案 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" => "相互作用"