我想使用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
),如何修改动画师/重力/碰撞行为以适应这种情况?
答案 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)];
如果你想在第一次碰撞后更改为另一个封闭的边界,那么很好,但首先你必须让对象进入参考视图。现在你用碰撞边界锁定了它。