Толчковое поведение относится к типу UIPushBehavior и обладает магнитудой и углом. Угол измеряется в радианах, а магнитуда в 1 точку приводит к ускорению движения, равному 100 точек/с2. Толчковые поведения создаются точно так же, как и любые другие: сначала их необходимо инициализировать, а потом добавить к аниматору типа UIDynamicAnimator.
В этом примере мы собираемся создать вид и поместить его в центре более крупного вида контроллера. Мы подключим к аниматору поведение столкновений, благодаря чему маленький вид не будет вылетать за пределы большого вида (с контроллером). О том, как работать со столкновениями, мы поговорили в разделе 2.2. Затем добавим регистратор жестов касания (см. раздел 10.5) к контроллеру вида. Этот регистратор будет уведомлять нас о каждом жесте касания, произошедшем на экране.
Когда касание будет зарегистрировано, рассчитаем угол между точкой касания и центром маленького квадратного вида. Так мы получим угол, выраженный в радианах, под которым сможем толкнуть этот квадратный вид. Затем рассчитаем расстояние между точкой касания и центром маленького вида, полученное значение используем в качестве магнитуды толчка. Таким образом, магнитуда будет тем больше, чем дальше от центра квадратного вида находится точка касания.
В данном разделе предполагается, что читатель понимает основы тригонометрии. Но даже если вы с ними не знакомы – ничего страшного, поскольку для работы потребуются лишь те формулы, которые я описываю в примерах кода к этому разделу. На рис. 2.2 показано, как вычисляется угол между двумя точками. Итак, я надеюсь, что объяснение получится достаточно подробным, чтобы вы могли написать собственное решение данной проблемы.
Рис. 2.2. Расчет угла между двумя точками
Итак, начнем с определения всех важных свойств нашего контроллера вида:
>#import "ViewController.h"
>@interface ViewController ()
>@property (nonatomic, strong) UIView *squareView;
>@property (nonatomic, strong) UIDynamicAnimator *animator;
>@property (nonatomic, strong) UIPushBehavior *pushBehavior;
>@end
>@implementation ViewController
><# Остальной ваш код находится здесь #>
В этом примере мы добавим к аниматору поведение столкновения и толчковое поведение. Толчковое поведение добавляется к классу в качестве свойства, а поведение столкновений – просто как локальная переменная. Дело в том, что, как только мы добавим к аниматору поведение столкновения, именно аниматор будет вычислять все столкновения с границами опорного вида и нам больше не придется ссылаться на это поведение столкновений. Однако если говорить о толчковом поведении, то при обработке касаний придется обновлять это толчковое поведение, чтобы графический элемент подталкивался к точке касания. Вот почему нам требуется связь касания с толчковым поведением, но не требуется такая связь со столкновениями.
Далее напишем метод, создающий маленький квадратный вид и помещающий его в центре большого вида с контроллером:
>– (void) createSmallSquareView{
>self.squareView =
>[[UIView alloc] initWithFrame:
>CGRectMake(0.0f, 0.0f, 80.0f, 80.0f)];
>self.squareView.backgroundColor = [UIColor greenColor];
>self.squareView.center = self.view.center;
>[self.view addSubview: self.squareView];
>}
>Затем применим регистратор жестов касания, чтобы обнаруживать прикосновения к виду с контроллером:
>– (void) createGestureRecognizer{
>UITapGestureRecognizer *tapGestureRecognizer =
>[[UITapGestureRecognizer alloc] initWithTarget: self
>action:@selector(handleTap:)];
>[self.view addGestureRecognizer: tapGestureRecognizer];
>}
Эти методы выполняют за нас всю необходимую работу. Позже, когда вид отобразится на экране, мы будем вызывать эти методы и они будут действовать.