Чтение онлайн

на главную - закладки

Жанры

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

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

Шрифт:

Итак, определим аниматор и вид:

#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 и убедитесь в том, что аниматор инициализирован с вышестоящим видом в качестве опорной сущности. Так вы гарантируете, что дочерние виды, на которые распространяется поведение столкновения (о чем мы вскоре поговорим), не будут выпадать за пределы вышестоящего вида.

Обсуждение

Поведение столкновения, относящееся к типу UICollisionBehavior, затрагивает объекты, соответствующие протоколу UIDynamicItem. Все виды типа UIView уже ему соответствуют, поэтому вам придется лишь инстанцировать ваши виды и добавить их к поведению столкновения. Поведение столкновения требует определить на экране границы, которые будут непреодолимы для элементов, находящихся в аниматоре. Например, если вы зададите линию, которая будет идти из нижнего левого угла вашего опорного вида в нижний правый угол (соответственно, это будет линия, вплотную прилегающая к его нижнему краю), а также добавите к этому виду поведение тяготения, то виды, расположенные на экране, будут двигаться под действием тяготения вниз, но не смогут «провалиться» с экрана, так как столкнутся с его нижним краем, который задается поведением столкновения.

Если вы хотите, чтобы границы области, в которой действует поведение столкновения, совпадали с границами опорного вида, то присвойте свойству translatesReferenceBoundsIntoBoundary экземпляра поведения столкновения значение YES. Если хотите самостоятельно провести линии, соответствующие границам такой области, просто воспользуйтесь методом экземпляра addBoundaryWithIdentifier: fromPoint: toPoint:, относящимся к классу UICollisionBehavior.

В этом примере мы собираемся создать два цветных вида, один из которых расположен на другом. После этого добавим к аниматору поведение тяготения, чтобы эти виды не перекрывали друг друга. Кроме того, они не будут выходить за границы опорного вида (то есть вида контроллера).

Итак, для начала определим массив видов и аниматор:

#import «ViewController.h»

@interface ViewController 

@property (nonatomic, strong) NSMutableArray *squareViews;

@property (nonatomic, strong) UIDynamicAnimator *animator;

@end

@implementation ViewController

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

Потом, когда вид появится на экране, зададим поведения столкновения и тяготения и добавим их к аниматору:

— (void)viewDidAppear:(BOOL)animated{

[super viewDidAppear: animated];

/* Создаем виды */

NSUInteger const NumberOfViews = 2;

self.squareViews = [[NSMutableArray alloc] initWithCapacity: NumberOfViews];

NSArray *colors = @[[UIColor redColor], [UIColor greenColor]];

CGPoint currentCenterPoint = self.view.center;

CGSize eachViewSize = CGSizeMake(50.0f, 50.0f);

Поделиться:
Популярные книги

Загадки истории. Факты. Открытия. Люди

Ермановская Анна Эдуардовна
Научно-образовательная:
история
7.00
рейтинг книги
Загадки истории. Факты. Открытия. Люди

Кодекс Охотника. Книга XL

Винокуров Юрий
40. Кодекс Охотника
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Кодекс Охотника. Книга XL

Атлантида

Касслер Клайв
15. Дирк Питт
Детективы:
боевики
6.67
рейтинг книги
Атлантида

Управленческая элита. Как мы ее отбираем и готовим

Тарасов Владимир
Деловая литература:
управление, подбор персонала
5.00
рейтинг книги
Управленческая элита. Как мы ее отбираем и готовим

12 тем. Маркетинг 21 века

Грант Джон
Документальная литература:
публицистика
5.00
рейтинг книги
12 тем. Маркетинг 21 века

Второгодка. Книга 2. Око за око

Ромов Дмитрий
2. Второгодка
Фантастика:
героическая фантастика
альтернативная история
фэнтези
5.00
рейтинг книги
Второгодка. Книга 2. Око за око

Когда небо стало пеплом, а земля инеем. Часть 1

Юй Фэйинь
1. Иней и пепел
Фантастика:
юмористическое фэнтези
уся
фэнтези
5.00
рейтинг книги
Когда небо стало пеплом, а земля инеем. Часть 1

Бастард Императора. Том 8

Орлов Андрей Юрьевич
8. Бастард Императора
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 8

Миры Источника. Трилогия

Авраменко Олег Евгеньевич
19. В одном томе
Фантастика:
фэнтези
5.60
рейтинг книги
Миры Источника. Трилогия

Звёздные корабли. Туманность Андромеды (ил. И. Шалито, Г. Бойко)

Ефремов Иван Антонович
Мир приключений изд. Правда
Фантастика:
научная фантастика
7.00
рейтинг книги
Звёздные корабли. Туманность Андромеды (ил. И. Шалито, Г. Бойко)

Стихотворения

Лермонтов Михаил Юрьевич
Поэзия:
поэзия
6.88
рейтинг книги
Стихотворения

США: История страны

Макинерни Дэниел
Биографии Великих Стран
Научно-образовательная:
история
7.17
рейтинг книги
США: История страны

Лунная пыль. Рассказы

Кларк Артур Чарльз
Фантастика:
научная фантастика
8.00
рейтинг книги
Лунная пыль. Рассказы

Сицилианская защита

Васильев Андрей Александрович
5. Акула пера в Мире Файролла
Фантастика:
фэнтези
киберпанк
рпг
9.27
рейтинг книги
Сицилианская защита