В этой главе мы исследуем различные комбинации подобных поведений и поговорим о том, как вы сможете сделать свои приложения более интерактивными, вооружившись поведениями UIKit и аниматорами. Начнем с простых примеров и постепенно будем выстраивать на их основе изучаемый материал, знакомясь с все более захватывающими примерами.
2.1. Добавление тяготения к компонентам пользовательского интерфейса
Постановка задачи
Необходимо, чтобы компоненты вашего пользовательского интерфейса двигались так, как будто на них действует сила тяжести: например, если перетащить элемент к верхнему краю экрана, то под действием силы тяжести он упадет к нижнему краю. Объединив эту возможность с поведением столкновения, которое мы изучим позднее, можно создавать такие компоненты пользовательского интерфейса, которые будут падать со своего действительного местоположения, пока не столкнутся с указанной вами линией.
Решение
Инициализируйте объект типа UIGravityBehavior и добавьте к нему те компоненты пользовательского интерфейса, которые должны испытывать тяготение к этому объекту. Сделав это, создайте экземпляр UIDynamicAnimator, добавьте к аниматору поведение тяготения, а всю остальную работу аниматор сделает за вас.
Обсуждение
В этом разделе мы создадим простой вид, представляющий собой раскрашенный квадрат, находящийся в одновидовом приложении. Этот вид мы поместим в центре экрана. Затем добавим к нему поведение тяготения и посмотрим, как он будет падать вниз, пока не скроется за пределами экрана.
Итак, определим аниматор и вид:
>#import "ViewController.h"
>@interface ViewController ()
>@property (nonatomic, strong) UIView *squareView;
>@property (nonatomic, strong) UIDynamicAnimator *animator;
>@end
>@implementation ViewController
><# Оставшаяся часть кода вашего контроллера вида находится здесь #>
Далее создадим небольшой вид, присвоим ему цвет и поместим в центре вида нашего контроллера. Так мы получим экземпляр класса UIGravityBehavior, воспользовавшись методом-инициализатором initWithItems:. Этот инициализатор принимает массив объектов, соответствующих протоколу UIDynamicItem. По умолчанию этому протоколу соответствуют все экземпляры UIView, поэтому, как только вид готов, можно идти дальше:
>– (void)viewDidAppear:(BOOL)animated{
>[super viewDidAppear: animated];
>/* Создаем маленький квадратный вид и добавляем его к self.view */
>self.squareView = [[UIView alloc] initWithFrame:
>CGRectMake(0.0f, 0.0f, 100.0f, 100.0f)];
>self.squareView.backgroundColor = [UIColor greenColor];
>self.squareView.center = self.view.center;
>[self.view addSubview: self.squareView];
>/* Создаем аниматор и реализуем тяготение */
>self.animator = [[UIDynamicAnimator alloc]
>initWithReferenceView: self.view];
>UIGravityBehavior *gravity = [[UIGravityBehavior alloc]
>initWithItems:@[self.squareView]];
>[self.animator addBehavior: gravity];
>}
Если вы не хотите добавлять тяготение ко всем вашим видам, как только инициализируете это поведение, то можете добавить его позже с помощью метода экземпляра addItem:, относящегося к классу UIGravityBehavior. Этот метод также принимает объект, соответствующий указанному ранее протоколу.
Теперь запустите ваше приложение. Как только вид в контроллере появится на экране, вы увидите цветной квадрат, падающий из центра экрана вниз, до нижнего края, а потом скрывающийся за пределами дисплея. Поведение тяготения, точно как реальная сила тяжести, заставляет элементы двигаться вниз, вплоть до определенной границы. Поскольку в данном случае никакой границы нет, элемент падает вниз до бесконечности. Мы исправим этот недостаток позже в данной главе, реализовав для элементов поведение столкновения.