24 February 2009

Программирование multi-touch в Mac OS X

Development for iOS
На новых MacBook, MacBookPro и MacBookAir есть такие виды жестов (gestures):

двумя пальцами — скролл
двумя пальцами — увеличение (magnify)
двумя пальцами — поворот (rotate)

тремя пальцами — swipe вертикальный
тремя пальцами — swipe горизонтальный

четырьмя пальцами — swipe вертикальный
четырьмя пальцами — swipe горизонтальный

Как пользоваться этими жестами, подробно показано в System Preferences->TrackPad.

Документация по мультитачу, вообще говоря, закрытая. Открыть ее обещали в 10.6.
Ниже — вкратце, то, что получилось найти в интернете и узнать из своих экспериментов.

Суть такая:
в наследнике NSResponder-а (в NSView или в NSWindow, как понравится) добавляем следующие функции (или некоторые из них):

- (void)beginGestureWithEvent:(NSEvent*) anEvent; //начало жеста
- (void)endGestureWithEvent:(NSEvent*) anEvent; //конец жеста
- (void)magnifyWithEvent:(NSEvent*) anEvent; // масштабирование двумя пальцами
- (void)rotateWithEvent:(NSEvent*) anEvent; // повороты двумя пальцами
- (void)swipeWithEvent:(NSEvent*) anEvent; // жест тремя пальцами


Подробнее об эти функциях.

- (void)beginGestureWithEvent:(NSEvent*) anEvent;
вызывается в начале любого жеста, в том числе и скролла двумя пальцами, за исключениеми жестов четырьмя пальцами, которые обрабатывает система и «не отпускает» в приложение. Определить, какой именно жест начинается у меня не получилось.

- (void)endGestureWithEvent:(NSEvent*) anEvent;
вызывается в конце любого жеста (опять таки, кроме четырехпалого).

- (void)magnifyWithEvent:(NSEvent*) anEvent; // масштабирование двумя пальцами
В этой функции главным параметром явлеятся [anEvent deltaZ]. Его надо домножить на подходящий коэффициент.
В моей программе коэффициент = 1000.

- (void)rotateWithEvent:(NSEvent*) anEvent; // повороты двумя пальцами
Главный параметр: [anEvent rotation]. Угол поворота измеряется в градусах, положительное направление — против часовой стрелки.

- (void)swipeWithEvent:(NSEvent*) anEvent; // жест тремя пальцами
Эта функция срабатывает и при вертикальном, и при горизонтальном swipe.
Главные параметры [anEvent deltaX] и [anEvent deltaY] могут быть равны 1.0 и -1.0 в зависимости от направления swipe.

Существует небольшая проблема, которая заключается в том, что, когда ты начинаешь делать rotate, может сработать и magnify. Поэтому надо создать какой-то флаг, который при начале rotate блокирует magnify, и наоборот.
В Preview, скорее всего, сделано примерно также.

Жесты четырех пальцев, как уже было написано, перехватывает система и, видимо, приложение их обработать не может.

Все очень подробно описывается здесь:
http://cocoadex.com/2008/02/nsevent-modifications-swipe-ro.html
http://www.cocoadev.com/index.pl?MultiTouchTrackpad

UPDATE.
Как указал himmelherz, на не самых новых MacBookPro тоже прекрасно работают четыре пальца. Включаются путем замены AppleUSBMultitouch.kext.
Подбробности тут http://forums.macrumors.com/showthread.php?t=582801&page=8
Tags:cocoamacosxobjective-c
Hubs: Development for iOS
+12
1.5k 15
Comments 15
Top of the last 24 hours