iOS. Приемы программирования - страница 77
Решение
Инициализируйте объект типа 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. Этот метод также принимает объект, соответствующий указанному ранее протоколу.
Теперь запустите ваше приложение. Как только вид в контроллере появится на экране, вы увидите цветной квадрат, падающий из центра экрана вниз, до нижнего края, а потом скрывающийся за пределами дисплея. Поведение тяготения, точно как реальная сила тяжести, заставляет элементы двигаться вниз, вплоть до определенной границы. Поскольку в данном случае никакой границы нет, элемент падает вниз до бесконечности. Мы исправим этот недостаток позже в данной главе, реализовав для элементов поведение столкновения.
См. также
Раздел 2.0.
2.2. Обнаружение столкновений между компонентами пользовательского интерфейса и реагирование на них
Постановка задачи
Требуется задать на экране границы столкновений между компонентами вашего пользовательского интерфейса так, чтобы эти компоненты не перекрывали друг друга.
Решение
Инстанцируйте объект типа UICollisionBehavior и прикрепите его к объекту аниматора. Присвойте свойству translatesReferenceBoundsIntoBoundary поведения столкновений значение YES и убедитесь в том, что аниматор инициализирован с вышестоящим видом в качестве опорной сущности. Так вы гарантируете, что дочерние виды, на которые распространяется поведение столкновения (о чем мы вскоре поговорим), не будут выпадать за пределы вышестоящего вида.