将手势识别器仅限于一个特定的UIView?

时间:2014-05-18 12:52:35

标签: ios uiview uigesturerecognizer gesture-recognition

我在myView上有一个名为myViewController的UIView。我有一个名为swipeLeft的UIGestureRecognizer(下面的代码),用于检测用户何时向其滑动。

问题是:myViewController在整个屏幕上识别相同的手势并执行另一个操作。因此,当myMethod swipeLeft的{​​{1}}区域为myViewController时,我希望我的应用myView执行UISwipeGestureRecognizer *swipeLeft = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(myMethod:)]; swipeLeft.direction = UISwipeGestureRecognizerDirectionLeft; swipeLeft.delaysTouchesBegan = YES; [self.myView addGestureRecognizer:swipeLeft];

myViewController

更多详细信息:我正在使用RESideMenu,而myViewController是正确的菜单,因此当它可见时,myView的整个视图会识别所有方向的滑动。我想在这个特定的UIView {{1}}中更改识别器。

谢谢!

1 个答案:

答案 0 :(得分:2)

首先,您需要将滑动手势添加到视图控制器头文件中。

@property (strong, nonatomic) UISwipeGestureRecognizer *swipeLeft;

如果您查看DEMORootViewController.m,您将看到此调用:

self.rightMenuViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"rightMenuViewController"];

这将调用你的awakeFromNib,这是你第一次做某事的机会。在这里,您将创建滑动手势。但是,您无法将其添加到视图中,因为此时您的插座尚未设置。第一次设置它们是在viewDidLoad中,因此您可以在其中将手势添加到视图中。因此,将其添加到视图控制器实现文件

- (void)awakeFromNib
{
    self.swipeLeft = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(myMethod:)];   
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self.swipeView addGestureRecognizer:self.swipeLeft];
}

- (void)myMethod:(UISwipeGestureRecognizer *)swipe
{
    NSLog(@"Did swipe") ;
}

最后,每当我们的swipeLeft手势发生时,您都需要告诉RESideMenu.m中的平移手势失败。这样做的方法是在第220行将以下代码添加到RESideMenu.m。这是在viewDidLoad方法的末尾。

if ([self.rightMenuViewController isKindOfClass:[DEMOVC class]]) {
            DEMOVC *rightVC = (DEMOVC *)self.rightMenuViewController;
            if (rightVC.swipeLeft) {
                [panGestureRecognizer requireGestureRecognizerToFail:rightVC.swipeGesture];
            } } }

这假设您的自定义VC名为DEMOVC。您还需要将自定义VC导入RESideMenu.m,如下所示:

#import "DEMOVC.h"

请告诉我这是否适合您,如果还有别的,我可以帮助您。