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

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

В данном рецепте мы собираемся создать маленький вид в центре основного вида контроллера, а потом прикрепить регистратор жестов касания (см. раздел 10.5) к виду с контроллером. Всякий раз, когда пользователь прикасается к экрану в какой-то точке, мы будем зацеплять за эту точку маленький квадратный вид. Итак, приступим к определению необходимых свойств вида с контроллером:


>#import "ViewController.h"


>@interface ViewController ()

>@property (nonatomic, strong) UIView *squareView;

>@property (nonatomic, strong) UIDynamicAnimator *animator;

>@property (nonatomic, strong) UISnapBehavior *snapBehavior;

>@end

>@implementation ViewController


><# Остальной ваш код находится здесь #>

>Далее напишем метод, который будет создавать регистратор жестов касания:

>– (void) createGestureRecognizer{


>UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]

>initWithTarget: self

>action:@selector(handleTap:)];

>[self.view addGestureRecognizer: tap];


>}


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


>– (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];

>}


Переходим к созданию аниматора (см. раздел 2.0), после чего прикрепляем к нему поведение зацепления. Инициализируем поведение зацепления типа UISnapBehavior с помощью метода initWithItem: snapToPoint:. Этот метод принимает два параметра:

• initWithItem – динамический элемент (в данном случае наш вид), к которому должно применяться поведение зацепления. Как и другие динамические поведения пользовательского интерфейса, этот элемент должен соответствовать протоколу UIDynamicItem. Все экземпляры UIView по умолчанию соответствуют этому протоколу, поэтому все нормально;

• snapToPoint – точка опорного вида (см. раздел 2.0), за которую должен зацепляться динамический элемент.

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


>– (void) createAnimatorAndBehaviors{

>self.animator = [[UIDynamicAnimator alloc]

>initWithReferenceView: self.view];


>/* Создаем обнаружение столкновений */

>UICollisionBehavior *collision = [[UICollisionBehavior alloc]

>initWithItems:@[self.squareView]];

>collision.translatesReferenceBoundsIntoBoundary = YES;


>[self.animator addBehavior: collision];


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

>self.snapBehavior = [[UISnapBehavior alloc]

>initWithItem: self.squareView

>snapToPoint: self.squareView.center];

>self.snapBehavior.damping = 0.5f; /* Medium oscillation */

Страница 91