iOS. Приемы программирования - страница 83
>[[UITapGestureRecognizer alloc] initWithTarget: self
>action:@selector(handleTap:)];
>[self.view addGestureRecognizer: tapGestureRecognizer];
>}
Эти методы выполняют за нас всю необходимую работу. Позже, когда вид отобразится на экране, мы будем вызывать эти методы и они будут действовать.
И не забудем написать метод, который будет задавать поведение столкновения и толчковое поведение:
>– (void) createAnimatorAndBehaviors{
>self.animator = [[UIDynamicAnimator alloc]
>initWithReferenceView: self.view];
>/* Создаем обнаружение столкновений */
>UICollisionBehavior *collision = [[UICollisionBehavior alloc]
>initWithItems:@[self.squareView]];
>collision.translatesReferenceBoundsIntoBoundary = YES;
>self.pushBehavior = [[UIPushBehavior alloc]
>initWithItems:@[self.squareView]
>mode: UIPushBehaviorModeContinuous];
>[self.animator addBehavior: collision];
>[self.animator addBehavior: self.pushBehavior];
>}
Подробнее о поведении столкновений рассказано в разделе 2.2. Как только мы запрограммируем все эти методы, нам понадобится вызывать их, когда вид появится на экране:
>– (void)viewDidAppear:(BOOL)animated{
>[super viewDidAppear: animated];
>[self createGestureRecognizer];
>[self createSmallSquareView];
>[self createAnimatorAndBehaviors];
>}
Отлично. Теперь, взглянув на файл реализации метода createGestureRecognizer, вы увидите, что мы устанавливаем регистратор жестов касаний в методе контроллера вида – этот метод называется handleTap:. В методе handleTap: вычисляем расстояние между центральной точкой маленького квадратного вида и той точкой опорного вида, до которой дотронулся пользователь. В результате имеем магнитуду силы толчка. Кроме того, рассчитаем угол между центром маленького квадратного вида и точкой касания, чтобы определить угол толчка:
>– (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. Всегда лучше экспериментировать с разными числовыми значениями, чтобы подобрать оптимальный вариант для