UIView部分的UIGestureRecognizer

问题描述 投票:9回答:2

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

我只希望手势在视图的特定区域中起作用,所以我制作了一个带有特定框架的新UIView并将其添加到根视图中。手势可以很好地解决此问题,但是现在唯一的问题是,我无法单击新视图(位于根视图上的对象)下方/下方的内容。如果我将userInteractionEnabled设置为NO,则会打断手势,因此这不是一个选项。

我该怎么解决?

感谢。

iphone objective-c ios uiview uigesturerecognizer
2个回答
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)创建您的手势识别器:

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的坐标系统(与附加识别器的视图相同的视图)中初始化敏感矩形。


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
    }
© www.soinside.com 2019 - 2024. All rights reserved.