2

我想使用UIDynamicAnimator重力/碰撞/弹性效果为物体放置动画。我查看了 Apple 的示例应用程序DynamicsCatalog,它非常简单,除了当对象从其容器边界之外开始时。

例如,这是从示例应用程序APLCollisionGravityViewController.m文件中获取的代码:

UIDynamicAnimator *animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];

UIGravityBehavior *gravityBeahvior = [[UIGravityBehavior alloc] initWithItems:@[self.square]];
[animator addBehavior:gravityBeahvior];

UICollisionBehavior *collisionBehavior = [[UICollisionBehavior alloc] initWithItems:@[self.square]];
collisionBehavior.translatesReferenceBoundsIntoBoundary = YES;
collisionBehavior.collisionDelegate = self;
[animator addBehavior:collisionBehavior];

如果框架self.square最初完全在self.view. 如果我将其更改为负值frame.origin.y,事情就会变得陌生。具体来说,如果 的绝对值frame.origin.y超过 的一半frame.size.height,则正方形似乎是在“吸引”向上而不是向下——它是上升而不是下降。

我正在寻找最初完全在容器边界之外的正方形(即我设置frame.origin.y = -frame.size.height),如何修改动画/重力/碰撞行为以适应它?

4

1 回答 1

4

问题是当对象试图进入参考视图时,您正在撞击顶部边界并导致碰撞!对象从外部坠落并从您的参考视图顶部反弹。

因此,您对碰撞边界的定义过于简单:

collisionBehavior.translatesReferenceBoundsIntoBoundary = YES;

不可以。您必须手动设置碰撞边界。例如,从参考视图底部的边界开始,以便对象可以进入场景并从地板反弹,如下所示:

UICollisionBehavior* coll = [UICollisionBehavior new];
coll.collisionMode = UICollisionBehaviorModeBoundaries;
coll.collisionDelegate = self;
[coll addBoundaryWithIdentifier:@"floor"
                      fromPoint:CGPointMake(0,self.view.bounds.size.height)
                        toPoint:CGPointMake(self.view.bounds.size.width,
                                            self.view.bounds.size.height)];

如果您想在第一次碰撞更改为不同的封闭边界集,很好,但首先您必须让对象进入参考视图。现在,您正在使用碰撞边界将其锁定。

于 2014-04-23T18:20:56.083 回答