Отключить вращение для UISnapBehavior?
Мне это нравится UISnapBehavior
фрагмент, но я действительно хочу использовать его для скольжения в одном направлении только с небольшим колебанием.
Есть ли способ отключить вращение для этого поведения? Как SpriteKit
имеет allowsRotation
свойство, которое можно легко отключить.
5 ответов
Вы можете сделать это, добавив UIDynamicItemBehavior
на ваш UIDynamicAnimator
а затем установить его allowsRotation
собственность на NO
вот так:
UIDynamicItemBehavior * dynamicItem = [[UIDynamicItemBehavior alloc] initWithItems:@[self.viewToSnap]];
dynamicItem.allowsRotation = NO;
[self.animator addBehavior:dynamicItem];
Вот лучший ответ: UISnapBehavior имеет свойство action, которое принимает блок, который вызывается на каждом шаге. Установка этого блока, как это...
snapBehavior.action = ^{ view.transform = CGAffineTransformIdentity; };
... вызывает вращение обнуляется без каких-либо других побочных эффектов.
Нет необходимостиUIKitDynamics
за это.
Просто нужно было использовать:
[UIView animateWithDuration:0.5
delay:0.0
usingSpringWithDamping:0.65
initialSpringVelocity:0.5
options:0
animations:^
{
self.transform = (self.expanded) ? self.openedTransition : self.closedTransition;
}
completion:nil];
Я сам искал то же решение, но настройка 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];
UIView соответствует UIDynamicItem, который имеет свойство transform, которое вызывается при выполнении поворота. Так что переопределение setTransform: с небытием...
- (void)setTransform:(CGAffineTransform)transform
{
}
... останавливает вращение, но, вероятно, с неизвестными и нежелательными побочными эффектами. Нужен какой-то способ проверить, выполняется ли динамическая анимация.
На пути к новой локации все еще будет некоторое оживленное движение, параллельное направлению движения.
Было бы здорово, если бы мы могли контролировать количество эффекта поворота / упругости, так как оно довольно карикатурно.