7

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

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

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

ответ

0

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

Используйте UIDynamicItemBehavior на свой взгляд. Установите сопротивление на высокое значение после столкновения, используя метод UICollisionBehaviorDelegate collisionBehavior: finishedContactForItem: 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]; 

} 
1

вам необходимо установить значение эластичности:

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]; 
+0

Это правильный ответ для iOS 8 и выше. – kelin

2

Я могу делать это неправильно, но следующий как представляется, работал в кратком примере:

Выделить 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; 
} 

Установка устойчивость к высокой стоимости на тот момент, кажется, освобождает пункт его отскока.