我在iOS应用程序中使用UIGestureRecognizer,但遇到了一些问题。
我只希望手势在视图的特定区域中起作用,所以我制作了一个带有特定框架的新UIView并将其添加到根视图中。手势可以很好地解决此问题,但是现在唯一的问题是,我无法单击新视图(位于根视图上的对象)下方/下方的内容。如果我将userInteractionEnabled设置为NO,则会打断手势,因此这不是一个选项。
我该怎么解决?
感谢。
请勿为手势识别器创建新视图。识别器实现locationInView:方法。将其设置为包含敏感区域的视图。在handleGesture上,像这样命中测试您关心的区域:
0]在包含您关心的区域的视图上执行所有这些操作。不要仅为手势识别器添加特殊视图。
1)设置mySensitiveRect
@property (assign, nonatomic) CGRect mySensitiveRect;
@synthesize mySensitiveRect=_mySensitiveRect;
self.mySensitiveRect = CGRectMake(0.0, 240.0, 320.0, 240.0);
2)创建您的手势识别器:
gr = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];
[self.view addGestureRecognizer:gr];
// if not using ARC, you should [gr release];
// mySensitiveRect coords are in the coordinate system of self.view
- (void)handleGesture:(UIGestureRecognizer *)gestureRecognizer {
CGPoint p = [gestureRecognizer locationInView:self.view];
if (CGRectContainsPoint(mySensitiveRect, p)) {
NSLog(@"got a tap in the region i care about");
} else {
NSLog(@"got a tap, but not where i need it");
}
}
应该在myView的坐标系统(与附加识别器的视图相同的视图)中初始化敏感矩形。
您也可以:
gestureRecognizer.delegate = self
某处。通常在viewDidLoad()上。然后实现方法:
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
let view = self.getTheViewDontWannaConsider() /* or whateva */
let point = touch.location(in:view)
if point.y >= 50 /* or whateva calc. you want */ {
return false
}
return true
}