0

私のアプリでは、長押しとそれに続くスワイプを認識するカスタムジェスチャレコグナイザーを作成したいと考えています。長押しの長さが1秒以上あるかどうかを測定する必要があります。そうである場合は、関数を呼び出して、スワイプ アクションが開始されるのを待ちます。

私の問題は、現在、プレスがどれくらいの長さだったかを知る唯一の方法は、touchesMoved から touchesBegan のタイムスタンプを抽出することです。ただし、 touchesMoved が呼び出されるまでの経過時間を知りたいです。

touchesMoved が呼び出される前にタップの長​​さを知る方法はありますか?

前もって感謝します!

4

1 に答える 1

2

あなたはコードを使用することができます、それは使用できますが、おそらくいくつかの詳細に対処する必要があります

.h ファイルに、次の ivar を追加する必要があります。

    TestView *aView ;//the view which you press
    NSThread *timerThread;              
    NSTimer *touchTimer;    

    NSDate *touchStartTime;         
    CGPoint touchStartPoint;            
    CGPoint lastTouchPoint;

.m ファイルに次のメソッドを追加する必要があります。

- (void)doSomething
{
    NSLog(@"Long press!!!");
}


- (void)startTimerThead{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSRunLoop *runLoop = [NSRunLoop currentRunLoop];

    touchTimer = [NSTimer scheduledTimerWithTimeInterval:0.2
                                                  target:self 
                                                selector:@selector(checkTouchTime:) 
                                                userInfo:nil repeats:YES];

    [runLoop run];
    [pool release];
}

- (void)stopTouchTimer{
    if (touchTimer != nil) {
        [touchTimer invalidate];
        touchTimer = nil;
    }
    if (timerThread != nil) {
        [timerThread cancel];
        [timerThread release];
        timerThread = nil;      
    }
}

#define DELETE_ACTIVING_TIME 1.0

- (void)checkTouchTime:(NSTimer*)timer{

            NSDate *nowDate = [NSDate date];
            NSTimeInterval didTouchTime = [nowDate timeIntervalSinceDate:touchStartTime];
            if (didTouchTime > DELETE_ACTIVING_TIME){


                [self stopTouchTimer];
                [self doSomething];
            }   


}



- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    UITouch *touch = [touches anyObject];
    UIView *touchView = [touch view];
    if ([touchView isKindOfClass:[TestView class]]) {

        touchStartTime = [[NSDate date] retain];

            if (nil == timerThread) {
                timerThread = [[NSThread alloc] initWithTarget:self selector:@selector(startTimerThead) object:nil];
                [timerThread start];
            }
        }
        touchStartPoint = [touch locationInView:self.view];
        lastTouchPoint = touchStartPoint;
}

#define TOUCH_MOVE_EFFECT_DIST 10.0f
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    CGPoint movedPoint = [touch locationInView:self.view];

    CGPoint deltaVector = CGPointMake(movedPoint.x - touchStartPoint.x, movedPoint.y - touchStartPoint.y);

        if (fabsf(deltaVector.x) > TOUCH_MOVE_EFFECT_DIST
            || fabsf(deltaVector.y) > TOUCH_MOVE_EFFECT_DIST) 
        {

            [self stopTouchTimer];
        }
}


- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{   
    UITouch *touch = [touches anyObject];
    UIView *touchView = [touch view];
    CGPoint movedPoint = [touch locationInView:self.view];
    CGPoint deltaVector = CGPointMake(movedPoint.x - touchStartPoint.x, movedPoint.y - touchStartPoint.y);

    if ([touchView isKindOfClass:[TestView class]]) {
            if (fabsf(deltaVector.x) < TOUCH_MOVE_EFFECT_DIST
                && fabsf(deltaVector.y) < TOUCH_MOVE_EFFECT_DIST) {
                [self stopTouchTimer];
            }
        }


}
于 2012-07-26T13:03:00.433 に答える