UIDynamicAnimator视图从参考边界外部input

我想animation使用UIDynamicAnimator和重力/碰撞/弹性效果来UIDynamicAnimator物体。 我看了一下苹果公司的示例应用程序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.square内,则效果良好。 如果我改变它,以便它有一个消极的frame.origin.y值,事情变得陌生。 具体来说,如果frame.origin.y的绝对值是frame.origin.y一半以上, frame.size.height这个方块似乎是“ frame.size.height ”而不是下降 – 它会上升而不是下降。

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

问题在于,当对象试图进入参考视图时,会撞到顶部边界并导致碰撞! 物体从外面落下,从参考视图顶部反弹。

因此,你对碰撞边界的定义太简单了:

 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)]; 

如果要第一次碰撞更改为不同的封闭边界则首先必须让对象进入参考视图。 现在你用碰撞边界locking它。