以编程方式更改UILongPressGestureRecognizer的状态

时间:2014-07-21 20:37:06

标签: ios selector uigesturerecognizer

我正在寻找一种方法来强制将UILongPressGestureRecognizer的状态更改为UIGestureRecognizerStateEnded以创建我自己的"最长持续时间"扩展到UILongPressGestureRecognizer(基本上是为了创建一种触摸和保持时间的功能)。

以下是我对此的尝试:

- (void)handleLongPressGestures:(UILongPressGestureRecognizer *)sender
{
        if (sender.state == UIGestureRecognizerStateBegan)
        {
            NSLog(@"Hold Gesture Started");
            timer = [NSTimer scheduledTimerWithTimeInterval:10.0 target:self selector:@selector(timesup:) userInfo:nil repeats:NO];
            //perform a function - i.e. start something
        }
        else if(sender.state == UIGestureRecognizerStateEnded)
        {
            NSLog(@"Hold Gesture Complete");
            [timer invalidate];
            timer = nil;
            //perform a function - i.e. stop something             
        }
}
-(void)timesup:(NSTimer *)timer {
    NSLog(@"Timer Up!");
    [longpress setState:UIGestureRecognizerStateEnded];
}

问题是[longpress setState:UIGestureRecognizerStateEnded];虽然在xcode中推荐,但仍然会抛出此错误:

No visible @interface for 'UILongPressGestureRecognizer' declares the selector 'setState:'

有关如何解决此问题/绕过此问题的任何想法?我尝试在SO上寻找解决方案,但我还没找到任何东西。话虽如此,如果这个问题与已经回答的问题重复,我会道歉 - 我还没有看到它(我保证!)

2 个答案:

答案 0 :(得分:5)

您收到此错误是因为默认情况下,当您将UIKit导入实现文件时,它会导入UIGestureRecognizer.h,它会公开声明其状态属性为readonly。如果您希望能够设置此属性,则必须导入UIGestureRecognizerSubclass.h,它将此属性重新声明为readwrite。请注意,这是在UIGestureRecognizer的子类中使用,我不知道如何在引擎盖下使用这个用法是安全的。

#import <UIKit/UIGestureRecognizerSubclass.h>

答案 1 :(得分:0)

Mick McCallum的回答也适用于 Swift 3

您需要#import <UIKit/UIGestureRecognizerSubclass.h>进入Project-Bridging-Header.h文件。

然后你就可以设置状态:

var longPressRecognizer: UILongPressGestureRecognizer!
self.longPressRecognizer.state = .ended