UICollisionBehavior - пользовательская форма для столкновения UIView

Я пытаюсь выяснить, как использовать UIKit Dynamics, чтобы успешно столкнуться с двумя UIViews, которые имеют пользовательские формы границ.

Самый простой пример, который я могу придумать, чтобы объяснить мой вопрос, - это столкновение двух кругов (с учетом их круглых углов) вместо их квадратной границы.

Я уверен, что где-то видел это, но я не могу найти документацию или обсуждение по этому вопросу из какого-либо официального источника.

1 ответ

Я тоже хотел бы сделать это, но я не думаю, что вы можете сделать это в соответствии с текущей UIKit Dynamics для iOS 7. Элементы, добавленные в аниматор, должны использовать протокол UIDynamicItem (UIView делает). Протокол только определяет их границы, которые должны быть прямоугольными, через свойство bounds, которое является CGRect. Там нет пользовательского теста на попадание.

Однако вы можете добавить фиксированный путь Безье к набору столкновений, и он может быть круглым или любой формы, которую вы можете сделать с помощью пути, но он будет действовать как изогнутая стена, от которой отскакивают другие прямоугольные объекты. Вы можете изменить образец кода DynamicsCatalog в XCode, чтобы увидеть использование изогнутой границы, которая не перемещается.

Создайте новый файл представления с именем BumperView, подкласс UIView. В BumperView.m используйте этот drawRect:

#define LINE_WIDTH 2.0
- (void)drawRect:(CGRect)rect
{
    UIBezierPath *ovalPath = [UIBezierPath bezierPathWithOvalInRect:CGRectInset(self.bounds, LINE_WIDTH/2, LINE_WIDTH/2)];
    [[UIColor blueColor] setStroke];
    [[UIColor lightGrayColor] setFill];
    ovalPath.lineWidth = LINE_WIDTH;
    [ovalPath stroke];
    [ovalPath fill];
}

В раскадровке для страницы "Свойства элемента" добавьте представление где-нибудь под полями, измените его класс на BumperView и измените его цвет фона на прозрачный. Создайте в APLItemPropertiesViewController.m выход с именем bumper, но присвойте ему класс BumperView. Добавьте следующее в функцию viewDidAppear после того, как collisionBehavior был создан:

UIBezierPath *bumperPath = [UIBezierPath bezierPathWithOvalInRect:self.bumper.frame];
[collisionBehavior addBoundaryWithIdentifier:@"Bumper" forPath:bumperPath];

Запустите его и перейдите на страницу свойств элемента, чтобы увидеть, как прямоугольники отскакивают от овала.

Другие вопросы по тегам