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];
}