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

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


Рис. 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];

>}

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

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


>– (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: вычисляем расстояние между центральной точкой маленького квадратного вида и той точкой опорного вида, до которой дотронулся пользователь. В результате имеем магнитуду силы толчка. Кроме того, рассчитаем угол между центром маленького квадратного вида и точкой касания, чтобы определить угол толчка:

Страница 87