Отключить вращение для 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
{
}

... останавливает вращение, но, вероятно, с неизвестными и нежелательными побочными эффектами. Нужен какой-то способ проверить, выполняется ли динамическая анимация.

На пути к новой локации все еще будет некоторое оживленное движение, параллельное направлению движения.

Было бы здорово, если бы мы могли контролировать количество эффекта поворота / упругости, так как оно довольно карикатурно.

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