UIGestureRecognizer用于部分UIView

时间:2012-02-19 03:02:48

标签: iphone objective-c ios uiview uigesturerecognizer

我在iOS应用程序中使用了UIGestureRecognizer,但是我遇到了一些问题。

我只希望手势在视图的某个区域中工作,所以我创建了一个具有特定帧的新UIView并将其添加到根视图中。这个手势很好用,但现在唯一的问题是我无法点击新视图下面/后面的东西(根视图上的对象)。如果我将userInteractionEnabled设置为NO,则会中断手势,因此这不是一个选项。

我该怎么做才能解决这个问题?

感谢。

2 个答案:

答案 0 :(得分:33)

不要为手势识别器创建新视图。识别器实现了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)创建你的gestureRecognizer:

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");
    }
}

敏感的rect应该在myView的坐标系中初始化,该坐标系与你附加识别器的视图相同。

答案 1 :(得分:0)

您还可以:

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
    }