Mac cocoa - как я могу определить жесты прокрутки трекпада?

Я хочу обнаружить жестов прокрутки (два пальца на трекпаде). Как мне это сделать?

Ответ 1

Вы должны сделать это, реализовав методы touch event NSView в вашем пользовательском подклассе. Эти методы:

- (void)touchesBeganWithEvent:(NSEvent *)event;
- (void)touchesMovedWithEvent:(NSEvent *)event;
- (void)touchesEndedWithEvent:(NSEvent *)event;
- (void)touchesCancelledWithEvent:(NSEvent *)event;

Объект NSEvent, входящий в качестве параметра, содержит информацию о затронутых касаниях. В частности, вы можете получить их, используя:

-(NSSet *)touchesMatchingPhase:(NSTouchPhase)phase inView:(NSView *)view;

Кроме того, в подклассе пользовательского вида вы должны сначала установить его следующим образом:

[self setAcceptsTouchEvents:YES]; 

чтобы получить такие события.

Ответ 2

Похоже, вы хотите переопределить метод просмотра scrollWheel:. Вы можете использовать методы NSEvent deltaX и deltaY, чтобы узнать, сколько прокрутила пользователь.

код:

@implementation MyView

- (void)scrollWheel:(NSEvent *)theEvent {
    NSLog(@"user scrolled %f horizontally and %f vertically", [theEvent deltaX], [theEvent deltaY]);
}

@end

Вы также можете взглянуть на "Руководство по отслеживанию событий трекпада" . Это покажет вам, как захватывать собственные жесты, в дополнение к стандартным.

Ответ 3

Чтобы обнаружить событие scrollWheel, используйте - (void) scrollWheel: (NSEvent *) методEvent.

    - (void)scrollWheel:(NSEvent *)theEvent
    {
        //implement what you want
    }

Вышеуказанный метод будет вызываться, когда вы прокручиваете с помощью колеса прокрутки с помощью мыши или жестов двух пальцев с трекпада.

Если ваш вопрос заключается в том, чтобы определить, генерируется ли событие scrollWheel с помощью мыши или трекпада, то, согласно документации Apple, это невозможно. Хотя здесь есть работа,

- (void)scrollWheel:(NSEvent *)theEvent
    {
        if([theEvent phase])
        {
            // theEvent is generated by trackpad
        }
        else
        {
            // theEvent is generated by mouse
        }
    }

Вы также можете использовать -(void)beginGestureWithEvent:(NSEvent *)event; и -(void)endGestureWithEvent:(NSEvent *)event. Эти методы вызывают до и после -(void)scrollWheel:(NSEvent *)theEvent соответственно.

Есть случай, когда это не сработает - если вы будете использовать жест 2 пальцев быстрее и выньте пальцы из трекпада довольно быстро, тогда у вас могут быть проблемы здесь - (Память не будет выпущена)