9

我喜欢那个UISnapBehavior片段,但我真的想用它在一个方向上滑动,只需要轻微的摆动。

有没有办法关闭这种行为的旋转?SpriteKit具有allowsRotation可以轻松关闭的属性 。

4

5 回答 5

28

您可以通过添加 aUIDynamicItemBehavior来做到这一点UIDynamicAnimator,然后将其allowsRotation属性设置为NO

UIDynamicItemBehavior * dynamicItem = [[UIDynamicItemBehavior alloc] initWithItems:@[self.viewToSnap]];
dynamicItem.allowsRotation = NO;
[self.animator addBehavior:dynamicItem];
于 2013-10-08T00:44:02.703 回答
11

这是一个更好的答案: UISnapBehavior 有一个 action 属性,它接受一个在每一步都被调用的块。像这样设置这个块......

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

... 导致旋转无效,没有任何其他副作用。

于 2013-10-04T19:45:38.357 回答
10

不需要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];
于 2013-10-03T13:42:47.877 回答
2

我自己也在寻找相同的解决方案,但是设置allowsRotationaUIDynamicItemBehavior并没有给我想要的效果。

我可以通过在我不想移动的视图的任一侧UISnapBehavior放置和放置两个边界来防止任何移动(在我的情况下,我在视图的左侧和右侧配置了边界以防止 x 轴移动UICollisionBehavior)。为了获得良好的弹跳效果,我还设置friction为 0(使用UIDynamicItemBehavior)并调整dampingUISnapBehavior来获得正确的弹跳量。

这是一个对我有用的例子:

[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];
于 2014-04-28T13:54:43.153 回答
0

UIView 符合 UIDynamicItem,它具有在进行旋转时调用的 transform 属性。所以覆盖 setTransform: 虚无......

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

... 停止旋转,但可能会产生未知和不良的副作用。需要一些方法来检查动态动画是否正在进行中。

在前往新位置的途中,仍然会有一些平行于移动方向的弹跳运动。

如果我们可以控制旋转/弹跳效果的数量,那就太好了,因为它很卡通。

于 2013-10-04T01:44:19.357 回答