UIKit Dynamics UICollisionBehavior столкновения без отказов

У меня есть вид, границы которого установлены для столкновений (setTranslatesReferenceBoundsIntoBoundaryWithInsets) и настройку подпредставления с гравитацией, чтобы она могла сталкиваться с границами суперпредставления.

Я пытаюсь сделать столкновение 0% бодрым, но я еще не понял, как. Я попробовал UIDynamicItemBehavior для подпредставления с эластичностью до 0, также со смехотворно высоким трением и ничем. Мое обоснование состояло в том, что 0 эластичность уже означает 0 регенерацию силы при ударе, но даже отрицательные числа, кажется, ничего не делают или очень мало с этим.

Есть какие-нибудь идеи относительно того, как заставить столкновение поглощать всю энергию или что-то, что заставляет подпредставление не подпрыгивать, когда оно сталкивается с границами?

3 ответа

Возможно, я делаю это неправильно, но в кратком примере, похоже, сработало следующее:

Выделите UIDynamicItemBehavior для рассматриваемого элемента (ов):

self.itemBehaviorInQuestion = [[UIDynamicItemBehavior alloc] initWithItems:@[self.infoView]];
self.itemBehaviorInQuestion.resistance = 0;

self.collisionBehavior = [[UICollisionBehavior alloc] initWithItems:@[self.infoView]];            

self.collisionBehavior.collisionDelegate = self;

[self.animator addBehavior:self.collisionBehavior];
[self.animator addBehavior:self.itemBehaviorInQuestion];

Реализуйте следующие методы делегата UICollisionBehavior:

- (void)collisionBehavior:(UICollisionBehavior *)behavior beganContactForItem:(id<UIDynamicItem>)item withBoundaryIdentifier:(id<NSCopying>)identifier atPoint:(CGPoint)p
{
    self.itemBehaviorInQuestion.resistance = 100;
}

- (void)collisionBehavior:(UICollisionBehavior *)behavior endedContactForItem:(id<UIDynamicItem>)item withBoundaryIdentifier:(id<NSCopying>)identifier
{
    self.itemBehaviorInQuestion.resistance = 0;
}

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

Вам нужно установить значение эластичности:

UIView* square = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
self.view addSubview:square

UIDynamicAnimator* a =  [[UIDynamicAnimator alloc] initWithReferenceView:self.view];
UIDynamicItemBehavior* behavior = [[UIDynamicItemBehavior alloc] initWithItems:@[square]];
behavior.elasticity = 0.5;
[a addBehavior:behavior];

У меня есть идея, как это сделать, но я не проверял это. Пусть покупатель будет бдителен!

Используйте UIDynamicItemBehavior на ваш взгляд. Установите высокое значение сопротивления после столкновения, используя метод UICollisionBehaviorDelegate collisionBehavior:endContactForItem:withItem. "Сопротивление" - это как трение между предметом и видом владения. Вот эскиз...

UIDynamicItemBehavior *lowFriction = [[UIDynamicItemBehavior alloc] init];
lowFriction.resistance = 0.0; 

UIDynamicItemBehavior *highFriction = [[UIDynamicItemBehavior alloc] init];
highFriction.resistance = 10.0; 

yourCollidingView *ycv = [[yourCollidingView alloc] init];  // yourCollidingView is a subclass of UIView

[noFriction addItem:ycv];

[myAnimator addBehavior:lowFriction];
[myAnimator addBehavior:highFriction];

Тогда в делегате

- (void)collisionBehavior:(UICollisionBehavior *)behavior endedContactForItem:(id<UIDynamicItem>)item1 withItem:(id<UIDynamicItem>)item2 {

    [lowFriction removeItem:item1];
    [lowFriction removeItem:item2];

    [highFriction addItem:item1];
    [highFriction addItem:item2];

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