在自定义类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;
}
答案 0 :(得分:1)
你在这里展示了很多麻烦的代码,所以很难知道从哪里开始。
对于initWithFrame:
,问题是永远不会为按钮调用此方法。此外,您已经发生了冲突,因为该按钮已经包含在内部响应点击的功能(它是一个按钮!)。
在第二组代码中,您从未将titleView
设置为视图,因此它为零,并且您的代码不执行任何操作。此外,您无法同时设置title
和titleView
(您正在设置title
)。
标题问题的答案当然是titleView
可以响应点按。很多应用程序都这样做(包括我的)。
此外,您不需要requireGestureRecognizerToFail
- 单击手势识别器和双击手势识别器已经知道如何在他们之间进行调解。
所以基本上我的建议是:停止过度复杂化一切。不要做出很大的假设并深入研究。从你熟悉的东西开始并采取一些措施。使用记录/断点测试所有内容,看看发生的事情是你想象的。