аналог swipeWithEvent для Lion - PullRequest
1 голос
/ 29 июля 2011

У снежного барса есть распознаватель жестов для событий смахивания:

- (void)swipeWithEvent:(NSEvent *)event {
    CGFloat x = [event deltaX];

    if (x != 0) {
        (x > 0) ? [self goBack] : [self goForward];
    }
}

Существует ли аналог, который обнаруживает смахивание двумя пальцами, как это делает приложение Safari для навигации по страницам в Lion?

Ответы [ 2 ]

1 голос
/ 01 августа 2011

В итоге я экстраполировал полезную информацию из этого коммита и внедрил ее в свой собственный проект:

    #define kSwipeMinimumLength 0.3

    - (void)swipeWithEvent:(NSEvent *)event {
    CGFloat x = [event deltaX];
    //CGFloat y = [event deltaY];

    if (x != 0) {
        (x > 0) ? [self goBack] : [self goForward];
    }
}

- (void)beginGestureWithEvent:(NSEvent *)event
{
    NSSet *touches = [event touchesMatchingPhase:NSTouchPhaseAny inView:nil];

    self.twoFingersTouches = [[NSMutableDictionary alloc] init];

    for (NSTouch *touch in touches) {
        [twoFingersTouches setObject:touch forKey:touch.identity];
    }
}

- (void)endGestureWithEvent:(NSEvent *)event
{
    if (!twoFingersTouches) return;

    NSSet *touches = [event touchesMatchingPhase:NSTouchPhaseAny inView:nil];

    // release twoFingersTouches early
    NSMutableDictionary *beginTouches = [twoFingersTouches copy];
    self.twoFingersTouches = nil;

    NSMutableArray *magnitudes = [[NSMutableArray alloc] init];

    for (NSTouch *touch in touches) 
    {
        NSTouch *beginTouch = [beginTouches objectForKey:touch.identity];

        if (!beginTouch) continue;

        float magnitude = touch.normalizedPosition.x - beginTouch.normalizedPosition.x;
        [magnitudes addObject:[NSNumber numberWithFloat:magnitude]];
    }

    // Need at least two points
    if ([magnitudes count] < 2) return;

    float sum = 0;

    for (NSNumber *magnitude in magnitudes)
        sum += [magnitude floatValue];

    // Handle natural direction in Lion
    BOOL naturalDirectionEnabled = [[[NSUserDefaults standardUserDefaults] valueForKey:@"com.apple.swipescrolldirection"] boolValue];

    if (naturalDirectionEnabled)
        sum *= -1;

    // See if absolute sum is long enough to be considered a complete gesture
    float absoluteSum = fabsf(sum);

    if (absoluteSum < kSwipeMinimumLength) return;

    // Handle the actual swipe
    if (sum > 0) 
    {
        [self goForward];
    } else
    {
        [self goBack];
    }


}

Это не проверено на 100%, но вы поймете идею.

0 голосов
/ 29 июля 2011

Да.См. Примечания к выпуску AppKit .(Вы должны читать их от начала до конца независимо от того.)

...