Я искал то же решение самостоятельно, но установка allowsRotation
на UIDynamicItemBehavior
Ждут» я вполне могу сказать, какой эффект я искал.
Я смог предотвратить любое перемещение от UISnapBehavior
, разместив с помощью UICollisionBehavior
и разместив две границы по обе стороны от просмотра, которые я не хотел перемещать (в моем случае я настроил границы слева и справа от вида для предотвращения движения по оси x). Чтобы получить хороший упругий эффект, я также установил friction
в 0 (используя UIDynamicItemBehavior
) и скорректировал damping
на UISnapBehavior
, чтобы получить нужное количество отскока.
Вот пример того, что работает для меня:
[self.animator removeAllBehaviors];
UISnapBehavior *snapBackBehavior = [[UISnapBehavior alloc] initWithItem:self.snappingView snapToPoint:self.slidePanelCenter];
snapBackBehavior.damping = 0.2;
[self.animator addBehavior:snapBackBehavior];
UIDynamicItemBehavior *itemBehavior = [[UIDynamicItemBehavior alloc] initWithItems:@[self.snappingView]];
itemBehavior.friction = 0.0;
[self.animator addBehavior:itemBehavior];
CGPoint leftBoundaryStart = CGPointMake(self.snappingView.frame.origin.x, 0.0);
CGPoint leftBoundaryEnd = CGPointMake(leftBoundaryStart.x, self.view.bounds.size.height);
CGPoint rightBoundaryStart = CGPointMake(leftBoundaryStart.x + self.snappingView.frame.size.width, 0.0);
CGPoint rightBoundaryEnd = CGPointMake(rightBoundaryStart.x, leftBoundaryEnd.y);
UICollisionBehavior *collisionBehavior = [[UICollisionBehavior alloc] initWithItems:@[self.snappingView]];
[collisionBehavior addBoundaryWithIdentifier:@"leftEdge" fromPoint:leftBoundaryStart toPoint:leftBoundaryEnd];
[collisionBehavior addBoundaryWithIdentifier:@"rightEdge" fromPoint:rightBoundaryStart toPoint:rightBoundaryEnd];
[self.animator addBehavior:collisionBehavior];
Это работало лучше всего для меня. Благодарю. – mxcl
Согласен, это метод остановки вращения в 'UISnapBehavior'. И если у вас есть другие поведения UIKit Dynamics, которые вам нужно выполнить (например,'UICollisionBehavior'), тогда это правильный ответ, поскольку предложенный в другом месте' animateWithDuration' не будет выполнять другие действия, которые могут возникнуть у вас на месте. – Rob