【问题标题】:how UILongPressGestureRecognizer worksUILongPressGestureRecognizer 的工作原理
【发布时间】:2014-05-06 04:43:11
【问题描述】:

我正在尝试了解手势识别器的工作原理,并尝试让手势识别器告诉我长触摸何时开始以及何时结束,即使触摸没有移动。

viewDidLoad 中,我添加了一个名为游戏的子视图。 在游戏中,我实现了两种识别触摸的方法。一个工作,但不做我想要的。另一个不起作用。

Method1我只是添加了两个方法:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"Began");
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *) event {
    NSLog(@"Ended");
}

这行得通,无需实例化手势识别器。谁能告诉我为什么?

这个问题是- (void)touchedEnded: 仅在触摸移动时才被调用,而不是在触摸在它开始的同一位置结束时才被调用。因此,如果我触摸并移动并放手,这两个函数都会被调用。如果我触摸并按住并放开(不动),则只会调用 - (void)touchesBegan

方法 2 我实例化了一个手势识别器:

@property (nonatomic, strong) UILongPressGestureRecognizer *lprg;

然后在我的设置中:

self.lprg = [UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)];

然后:

- (void)handleLongPress:(UILongPressGestureRecognizer *)recognizer {
    NSLog(@"Handling");
    switch (recognizer.state) {
     case UIGestureRecognizerStateBegan:
         // ...
    }
}

但是这个,我以编程方式实例化识别器,没有工作。我从来没有在控制台中得到任何 NSLog 输出。

【问题讨论】:

    标签: ios uigesturerecognizer


    【解决方案1】:

    UIResponder 的所有子类(UIView 是)都响应 touchesBegan,这就是为什么您不必做任何事情并且免费获得它的原因。然而,它远非手势识别器。在高层次上,手势识别器跟踪很多东西,例如状态。当然你可以开始使用触摸,但想象一下扩展它以拾取三指长按、滑动或捏合之类的东西。事情很快变得丑陋。安装手势识别器可以简化事情。

    例如长按:

    UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] init];
    longPress.numberOfTouchesRequired = 3;
    [longPress addTarget:self action:@selector(longPressDetected:)];
    [self.view addGestureRecognizer:longPress];
    

    编辑

    实现委托:

    在您的实现文件 (.m) 中,在 @implemation 行的末尾添加该行。它应该看起来像

     @implementation ViewController <UIGestureRecognizerDelegate>
    

    然后在你分配并初始化你的手势识别器之后,如下设置委托

     longPress.delegate = self;
    

    然后从https://developer.apple.com/library/ios/documentation/uikit/reference/UILongPressGestureRecognizer_Class/Reference/Reference.html 实现尽可能多的方法。例如你可以考虑这两个

    - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
        return YES;
    }
    
    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
        return YES;
    }
    

    【讨论】:

    • 谢谢。您指出我没有的一项是“[self addGestureRecognizer:longPress]”。不幸的是,这似乎对我也不起作用?没有错误...但是该函数永远不会被调用... ??
    • 确保您还设置了所需的抽头次数,1 可能就是您想要的。如果这仍然不起作用,那么了解更多关于您在何处使用它的上下文会很有帮助。例如,scrollviews 和 tableviews 有自己的手势识别器,可以干扰你的。如果是这种情况,请尝试实现 UIGesturerecognizer 委托方法并将自己设置为它的委托以查看发生了什么。
    • 在我的主视图控制器中,我这样做:` Game* game = [[Game alloc] initWithFrame:self.view.bounds]; [self.view addSubview:game]; [游戏设置];` 然后在game.m中,在-(void) setup {}中,实现上面的代码。除了[self addGestureRecognizer:lprg];,我在当前视图中还没有按钮或任何东西。我想让这个手势识别器首先工作。我有lprg.numberOfTapsRequired = 1;,但这并没有帮助...
    • 所以其中一些可能是显而易见的,但值得一问。框架是否设置为大到可以触摸的东西?如果帧类似于 (0,0,0,0),则识别器将不起作用。您是否使用正确数量的手指进行长按?是否有其他视图覆盖了您的游戏视图?如果这些都不是问题,当您实现手势识别器委托时会发生什么?
    • 其实……这是一个全新的项目。上面引用的 View Controller 是主 View Controller。为了好玩,在 game.m 中,我做了一个 self.frame.size.height & Width 的 NSLog,得到了 480,320。没有其他代码。真的... :)。我将如何实现委托?
    【解决方案2】:

    您必须使用此代码来初始化手势

      UILongPressGestureRecognizer *gesture1 = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(celllongpressed:)];
        [gesture1 setDelegate:self];
        [gesture1 setMinimumPressDuration:1];
        [self addGestureRecognizer:gesture1];
    

    目标方法使用这个

    -(void)celllongpressed:(UIGestureRecognizer *)longPress
    {
    }
    

    【讨论】:

    • 感谢您的回复。你能告诉我你的建议与我的“方法 2”有什么不同,除了在一行上同时声明和分配和初始化吗?不过我会试试的……
    • 不确定这个答案是否被编辑...但是是的...[self addGestureRecognizer:gesture1]; 是我丢失的部分。对不起,如果我在您第一次回复时错过了它。谢谢回复!
    • 因为你必须将你的手势添加到你自己的 GestureRecognizer 中才能识别它。
    • iOS8 有变化:在 iOS7 中我可以通过 LongPress 获得弹出视图的位置...在 iOS8 中不再是
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-24
    • 2021-03-20
    • 2011-10-26
    • 2017-12-02
    • 2014-04-04
    相关资源
    最近更新 更多