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 */