UIView对象中的UIGestureRecognizer
我创build了一个UIViewController
,其中包含一个UIView
对象。
我希望UIView
对象响应一个手指的一个水龙头,还捏两个手指。
我已经点击xib中的“用户交互启用”和“多点触摸”选项。
我在UIView
函数initWithFrame:中创build了UITapGestureRecognizer
和UIPinchGestureRecognizer
,因为它是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:
它会正常工作。
有两种方法可以解决这个问题,
-
将手势设置移至其他方法,并在
initWithFrame:
和initWithCoder:
调用它们。 如果您打算重复使用此组件并在手势上公开某种callback,我会build议您这样做。 -
如果你想实现一次,并有很多与控制器元素交互,请将其添加到
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
通常在UIViewController
的viewDidLoad
方法中完成。