Как сделать щипковые жесты на iPhone? - PullRequest
11 голосов
/ 10 июля 2009

Как реализовать щипковые жесты на iPhone? Я знаком с использованием сенсорных событий на iPhone, но я очень ленив и не хочу заново изобретать колесо для чего-то столь же распространенного, как жесты PINCH ... Исходный код или ссылки на него были бы полезны.

Ответы [ 4 ]

8 голосов
/ 25 октября 2010

Уверен, что представленные здесь решения устарели в пользу использования нового класса UIPinchGestureRecognizer в iOS 3.2 и новее.

8 голосов
/ 10 июля 2009

Вы должны реализовать это самостоятельно, используя некоторую базовую математику.

(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;

Это те методы делегатов, которые вам нужно реализовать в вашем приложении.

Вам нужно получить расстояние между двумя касаниями, а затем рассчитать изменения расстояния в вашем собственном коде.

Математическое уравнение, которое вы используете для получения расстояния, называется точечным произведением

Я просто хочу отметить, что уравнение, которое они используют в цитируемом уроке, неверно. Я обновил его, добавив абсолютное значение, пропущенное в руководстве.

Это точечное произведение:

- (CGFloat)distanceBetweenTwoPoints:(CGPoint)fromPoint toPoint:(CGPoint)toPoint
{
    float xDist = fromPoint.x - toPoint.x;
    float yDist = fromPoint.y - toPoint.y;

    float result = sqrt( pow(xDist,2) + pow(yDist,2) );
    return result;
}

Edit: Я допустил ошибку в своем предыдущем ответе… прошло много времени с тех пор, как я применил любую такую ​​математику.

Если вы не получите квадратный корень из результата, вы не получите истинное расстояние между точками. Это называется вычислением величины между двумя векторами.

Это правильный способ сделать это. Если вы хотите опустить sqrt, у вас не будет точного расстояния между двумя точками.

Если вы не укажете ответ, ваш код будет работать, но он будет использовать измерения, которые намного больше, чем фактические значения. Так что в будущем, если вам нужно получить расстояние между двумя точками, он вернет что-то вроде 90000 вместо фактического расстояния в пикселях, которое будет 300px.

6 голосов
/ 12 ноября 2009

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

Вам действительно нужно использовать теорему Пифагора. Точка НИЧЕГО не делает с поиском расстояния между точками - только пифагорово!

1 голос
/ 10 июля 2009

Если вы ищете простой пример кода жеста пинч, я использую метод, описанный Броком в примере приложения. Я опишу здесь (в предпоследней и последней версиях приложение на этой странице). Пинч-жесты используются для масштабирования пары слоев Core Animation в этом примере.

Все, что он описывает для расчета расстояния, - это просто теорема Пифагора, применяемая между двумя точками (с расстояниями X и Y в качестве двух граней прямоугольного треугольника).

...