UIDynamicAnimator视图从引用边界外部进入

时间:2014-04-23 18:18:42

标签: ios objective-c ios7 uidynamicanimator

我想使用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),如何修改动画师/重力/碰撞行为以适应这种情况?

1 个答案:

答案 0 :(得分:4)

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

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

collisionBehavior.translatesReferenceBoundsIntoBoundary = YES;

没有。您必须手动设置碰撞边界。例如,从一个只是参考视图的 bottom 的边界开始,这样对象就可以进入场景并从地板反弹,如下所示:

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

如果你想在第一次碰撞后更改为另一个封闭的边界,那么很好,但首先你必须让对象进入参考视图。现在你用碰撞边界锁定了它。