Вандад Нахавандипур

iOS. Приемы программирования


Скачать книгу

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

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

      [self.animator addBehavior: self.snapBehavior];

      }

      Как видите, здесь мы зацепляем небольшой квадратный вид, связывая его с текущим центром, – в сущности, просто оставляем его на месте. Позже, когда мы регистрируем на экране жесты касания, мы обновляем поведение зацепления. Кроме того, необходимо отметить, что мы задаем для этого поведения свойство damping. Это свойство будет управлять эластичностью, с которой элемент будет зацеплен за точку. Чем выше значение, тем меньше эластичность, соответственно, тем слабее «колышется» элемент. Здесь можно задать любое значение в диапазоне от 0 до 1. Теперь, когда вид появится на экране, вызовем эти методы, чтобы инстанцировать маленький квадратный вид, установить регистратор жестов касания, а также настроить аниматор и поведение зацепления:

      – (void)viewDidAppear:(BOOL)animated{

      [super viewDidAppear: animated];

      [self createGestureRecognizer];

      [self createSmallSquareView];

      [self createAnimatorAndBehaviors];

      }

      После создания регистратора жестов касания в методе createGestureRecognizer вида с контроллером мы приказываем регистратору сообщать