在自定义类MMTimerButton中,我设置按钮以响应单个和一个双击。
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
[self setBackgroundColor: [UIColor clearColor]];
UITapGestureRecognizer *singleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
singleTapRecognizer.numberOfTapsRequired=1;
singleTapRecognizer.delaysTouchesEnded=YES;
UITapGestureRecognizer *doubleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleTap:)];
doubleTapRecognizer.numberOfTapsRequired=2;
[singleTapRecognizer requireGestureRecognizerToFail: doubleTapRecognizer];
[self addGestureRecognizer:singleTapRecognizer];
[self addGestureRecognizer:doubleTapRecognizer];
}
return self;
}我在同一个文件中实现了这两种方法
-(void)handleTap:(UITapGestureRecognizer *)sender{
NSLog(@"single tap");
}
-(void)handleDoubleTap:(UITapGestureRecognizer *)sender{
NSLog(@"double tap");
}在标题中,我声明了两个方法
#import <UIKit/UIKit.h>
@interface MMTimerButton : UIButton
-(void)handleTap:(UITapGestureRecognizer *)sender;
-(void)handleDoubleTap:(UITapGestureRecognizer *)sender;在情节提要中,我向接口添加了一个按钮,并将其自定义类设置为MMTimerButton。
当我单击按钮(在模拟器中)时,什么都没有发生。一次点击,两次点击,都没有。
我还尝试不使用按钮,只需在titleView中添加手势识别器。当我单击模拟器中的标题时,什么都不会发生。
UITapGestureRecognizer* doubleTap = [[UITapGestureRecognizer alloc] initWithTarget : self action : @selector (handleDoubleTap:)];
UITapGestureRecognizer* singleTap = [[UITapGestureRecognizer alloc] initWithTarget : self action : @selector (handleSingleTap:)];
[singleTap requireGestureRecognizerToFail : doubleTap];
[doubleTap setDelaysTouchesBegan : YES];
[singleTap setDelaysTouchesBegan : YES];
[doubleTap setNumberOfTapsRequired : 2];
[singleTap setNumberOfTapsRequired : 1];
self.navigationItem.title =@"title";
[self.navigationItem.titleView addGestureRecognizer:doubleTap];
[self.navigationItem.titleView addGestureRecognizer:singleTap];但是,当我将此代码添加到头视图时,它可以正常工作(在模拟器中)。
-(UIView*)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
UILabel *headerLabel = [[UILabel alloc]init];
headerLabel.tag = section;
headerLabel.userInteractionEnabled = YES;
headerLabel.backgroundColor = [UIColor clearColor];
headerLabel.text = [NSString stringWithFormat:@"0:00",section];
headerLabel.textAlignment = UITextAlignmentCenter;
headerLabel.frame=CGRectMake(10,-5,tableView.frame.size.width,41);
UITapGestureRecognizer* doubleTap = [[UITapGestureRecognizer alloc] initWithTarget : self action : @selector (handleDoubleTap:)];
UITapGestureRecognizer* singleTap = [[UITapGestureRecognizer alloc] initWithTarget : self action : @selector (handleSingleTap:)];
[singleTap requireGestureRecognizerToFail : doubleTap];
[doubleTap setDelaysTouchesBegan : YES];
[singleTap setDelaysTouchesBegan : YES];
[doubleTap setNumberOfTapsRequired : 2];
[singleTap setNumberOfTapsRequired : 1];
self.navigationItem.title =@"title";
[headerLabel addGestureRecognizer:doubleTap];
[headerLabel addGestureRecognizer:singleTap];
return headerLabel;
//return nil;
}发布于 2014-05-16 02:57:34
您在这里显示了很多麻烦的代码,所以很难知道从哪里开始。
initWithFrame:的情况下,问题是该方法从未被调用过按钮。此外,您有一个冲突,因为按钮已经包含了对内部点击(它是一个按钮!)的响应能力。titleView设置为视图,因此它是零,而您的代码什么也不做。另外,您不能同时设置title和titleView (您正在设置title)。你的标题问题的答案是,当然,一个titleView可以回应一个点击。很多应用程序都是这样做的(包括我的)。
另外,你不需要你的requireGestureRecognizerToFail -一个单一的点击手势识别器和一个双点击手势识别器已经知道如何在它们之间进行调解。
所以基本上我的建议是:停止使一切复杂化。不要做大的假设,而要投入其中。从你知道有用的东西开始,然后采取一些小步骤。使用日志记录/断点测试所有内容,看看正在发生的事情是您所想象的。
https://stackoverflow.com/questions/23691867
复制相似问题