2013-10-02 2 views
8

Мне это нравится UISnapBehavior фрагмент, но я действительно хочу использовать его для скольжения в только в одном направлении с небольшим колебанием.Отключить вращение на UISnapBehavior?

Есть ли способ отключить вращение для этого поведения? SpriteKit имеет allowsRotation имущество, которое легко отключить.

ответ

26

Вы можете сделать это, добавив UIDynamicItemBehavior к вашему UIDynamicAnimator и затем установить его свойство allowsRotation к NO так:

UIDynamicItemBehavior * dynamicItem = [[UIDynamicItemBehavior alloc] initWithItems:@[self.viewToSnap]]; 
dynamicItem.allowsRotation = NO; 
[self.animator addBehavior:dynamicItem]; 
+0

Это работало лучше всего для меня. Благодарю. – mxcl

+0

Согласен, это метод остановки вращения в 'UISnapBehavior'. И если у вас есть другие поведения UIKit Dynamics, которые вам нужно выполнить (например,'UICollisionBehavior'), тогда это правильный ответ, поскольку предложенный в другом месте' animateWithDuration' не будет выполнять другие действия, которые могут возникнуть у вас на месте. – Rob

8

Нет необходимости в 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]; 
+1

Договорились, если все, что вы хотите, это пружинный эффект, это более простой подход, чем при использовании UIKit Dynamics. – Rob

0

UIView соответствует UIDynamicItem, который имеет свойство преобразования, который вызывается, когда вращение производится. Так наиважнейшая SetTransform: с небытием ...

- (void)setTransform:(CGAffineTransform)transform 
{ 
} 

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

По пути в новое место по-прежнему будет какое-то упругое движение, параллельное направлению движения.

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

7

Вот лучший ответ. У UISnapBehavior есть свойство action, которое принимает блок, который вызывается на каждом шаге. Установка этого блока, подобный этому ...

snapBehavior.action = ^{ view.transform = CGAffineTransformIdentity; }; 

... вызывает поворот вращения без каких-либо других побочных эффектов.

1

Я искал то же решение самостоятельно, но установка 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]; 
Смежные вопросы