Размер шрифта
-
+

iOS. Приемы программирования - стр. 88


>– (void) handleTap:(UITapGestureRecognizer *)paramTap{


>/* Получаем угол между центральной точкой квадратного вида и точкой касания */


>CGPoint tapPoint = [paramTap locationInView: self.view];

>CGPoint squareViewCenterPoint = self.squareView.center;


>/* Вычисляем угол между центральной точкой квадратного вида и точкой касания, чтобы определить угол толчка

>Формула для определения угла между двумя точками:

>arc tangent 2((p1.x – p2.x), (p1.y – p2.y)) */


>CGFloat deltaX = tapPoint.x – squareViewCenterPoint.x;

>CGFloat deltaY = tapPoint.y – squareViewCenterPoint.y;

>CGFloat angle = atan2(deltaY, deltaX);

>[self.pushBehavior setAngle: angle];


>/* Используем расстояние между точкой касания и центром квадратного вида для вычисления магнитуды толчка

>Формула определения расстояния:

>Квадратный корень из ((p1.x – p2.x)^2 + (p1.y – p2.y)^2) */


>CGFloat distanceBetweenPoints =

>sqrt(pow(tapPoint.x – squareViewCenterPoint.x, 2.0) +

>pow(tapPoint.y – squareViewCenterPoint.y, 2.0));

>[self.pushBehavior setMagnitude: distanceBetweenPoints / 200.0f];

>}

Не буду чрезмерно углубляться в тригонометрию, но в этом коде используется простая формула, изучаемая в школьном курсе. По этой формуле рассчитывается угол в радианах между двумя точками. Также применяется теорема Пифагора, позволяющая узнать расстояние между двумя точками. Эти формулы вы найдете, взглянув на комментарии, которые я оставил в коде. Если же хотите подробнее разобраться с такими понятиями, как углы и радианы, рекомендую проштудировать учебник по тригонометрии.

Теперь, запустив приложение, вы сначала увидите маленький зеленый квадрат в центре экрана. Дотроньтесь до экрана в любой точке поля, окружающего квадрат (белое пространство), чтобы зеленый квадрат (вид) стал двигаться. В данном примере я беру расстояние между точкой касания и центром квадрата и делю его на 200, чтобы получить реалистичную магнитуду толчка, но вы в данном примере можете увеличить ускорение, выбрав, скажем, значение 100, а не 200. Всегда лучше экспериментировать с разными числовыми значениями, чтобы подобрать оптимальный вариант для вашего приложения.

См. также

Раздел 2.2.

2.4. Прикрепление нескольких динамических элементов друг к другу

Постановка задачи

Требуется прикреплять друг к другу динамические элементы, например виды, так, чтобы движения одного вида автоматически приводили в движение второй. В качестве альтернативы можно прикреплять динамический элемент к точке привязки, чтобы при движении этой точки (в результате действий приложения или пользователя) этот элемент автоматически перемещался вместе с ней.

Решение

Инстанцируйте поведение прикрепления, относящееся к типу UIAttachmentBehavior, с помощью метода экземпляра initWithItem: point: attachedToAnchor: этого класса. Добавьте это поведение к аниматору (см. раздел 2.0), отвечающему за динамику и физику движения.

Обсуждение

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

Допустим, у вас на столе лежит большая фотография. Если вы поставите указательный палец в верхний правый угол фотографии и начнете совершать им вращательные движения, то фотография, возможно, также будет вертеться на столе вместе с вашим пальцем. Такое же реалистичное поведение вы можете создать и в iOS, воспользовавшись поведением прикрепления из UIKit.

Страница 88