【问题标题】:Limit Gesture Recognizer to Only One Specific UIView?将手势识别器限制为仅一个特定的 UIView?
【发布时间】:2014-05-18 12:52:35
【问题描述】:

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

问题是:myViewController 在整个屏幕上识别出相同的手势并执行另一个动作。所以我希望我的应用程序在swipeLeft 这个特定区域myViewController 中执行myMethod,该区域为myView

UISwipeGestureRecognizer *swipeLeft = [[UISwipeGestureRecognizer alloc] initWithTarget:self
                                                           action:@selector(myMethod:)];
swipeLeft.direction = UISwipeGestureRecognizerDirectionLeft;
swipeLeft.delaysTouchesBegan = YES;
[self.myView addGestureRecognizer:swipeLeft];

更多细节:我使用的是RESideMenu,而myViewController是正确的菜单,所以当它可见时,myViewController的整个视图可以识别各个方向的滑动。我想在这个特定的 UIView myView 中更改识别器。

谢谢!

【问题讨论】:

标签: ios uiview uigesturerecognizer gesture-recognition


【解决方案1】:

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

@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 中的平移手势失败。这样做的方法是将以下代码添加到 RESideMenu.m 的第 220 行。那是在 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"

如果这对您有用,请告诉我,如果还有其他事情我可以帮助您。

【讨论】:

  • 感谢您的报道。我正在尝试逐步执行此操作,但我遇到了问题。顺便说一句,我没有使用 Storyboards。我试图在我的rightMenu 上的 UIView 中实现这个 swipeLeft 手势,而不是我的根视图。所以我将滑动手势添加到我的rightSideMenuViewController.h,正如你所说的第一件事。至于下一行,我没有看到它,因为我没有使用 Storyboard。那么我在哪里粘贴awakeFromNib 代码块?在我的rightSideMenuViewController.h或者第一个出现的VC里面,叫rootViewController?
  • awakeFromNib 的重点是尽快创建手势,以便在创建平移手势时设置滑动手势。但我相信 awakeFromNib 是一个故事板的东西。你可以把它放在 rightSideMenuViewController.m 的- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 中(一旦有人初始化视图控制器就会被调用)。
  • 至于 if 语句,它需要在平移手势识别器被分配和初始化之后执行。还将类从 DEMOVC 更改为 DEMORightSideMenuViewController。
  • 是的,对 swipeGesture 感到抱歉,忘记更改了。我很确定 if 语句还没有放在正确的位置,如果你把它放在正确的位置,它应该可以工作(或至少编译)。它应该在 RESideMenu.m 的 - (void)viewDidLoad 的底部附近,就在 UIPanGestureRecognizer *panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(__panGestureRecognized:)]; 这一行之后
  • 没问题。乐于助人:)
猜你喜欢
  • 1970-01-01
  • 2012-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
  • 2023-03-04
相关资源
最近更新 更多