UIView对象中的UIGestureRecognizer

我创build了一个UIViewController ,其中包含一个UIView对象。

我希望UIView对象响应一个手指的一个水龙头,还捏两个手指。

我已经点击xib中的“用户交互启用”“多点触摸”选项。

我在UIView函数initWithFrame:中创build了UITapGestureRecognizerUIPinchGestureRecognizer ,因为它是UIView对象的唯一入口点。 但该对象不响应UIGestureRecognizer对象。 为什么? 或者,放置UIGestureRecognizer对象的最佳位置在哪里?

 - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { // Initialization code // single tap UITapGestureRecognizer* singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)]; singleTap.numberOfTapsRequired = 1; singleTap.numberOfTouchesRequired = 1; [self addGestureRecognizer: singleTap]; // 2 fingers pinch UIPinchGestureRecognizer* doubleMove = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleMove:)]; [self addGestureRecognizer: doubleMove]; } return self; } 

你的问题是,当你在IB实例化自定义视图子类时,调用initWithCoder: 如果你使用initWithFrame:编程方式完成它initWithFrame:它会正常工作。

有两种方法可以解决这个问题,

  1. 将手势设置移至其他方法,并在initWithFrame:initWithCoder:调用它们。 如果您打算重复使用此组件并在手势上公开某种callback,我会build议您这样做。

  2. 如果你想实现一次,并有很多与控制器元素交互,请将其添加到viewDidLoad

我试过你的代码,它适用于我。

你在哪里设置视图? 也许它有前面的任何其他视图,或者它的超级视图禁用了userInteractionEnabled

我创build了一个UIView子类并添加了这个代码:

 -(void) handleSingleTap:(UITapGestureRecognizer *)gr { NSLog(@"handleSingleTap"); } -(void) handleDoubleMove:(UIPinchGestureRecognizer *)gr { NSLog(@"handleDoubleMove"); } - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { // Initialization code // single tap UITapGestureRecognizer* singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)]; singleTap.numberOfTapsRequired = 1; singleTap.numberOfTouchesRequired = 1; [self addGestureRecognizer: singleTap]; // 2 fingers pinch UIPinchGestureRecognizer* doubleMove = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleMove:)]; [self addGestureRecognizer: doubleMove]; } return self; } 

然后,在我的控制器中:

 -(void) viewDidLoad { [super viewDidLoad]; MyView * myView = [[MyView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)]; myView.backgroundColor = [UIColor greenColor]; [self.view addSubview:myView]; [myView release]; } 

它工作。

我想如果你正在使用.xib,初始化也可以在.xib中完成

– (无效)awakeFormNib;

添加GestureRecognizers通常在UIViewControllerviewDidLoad方法中完成。