我想使用 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 ),我该如何修改动画师/gravity/collision 行为来适应这种情况?
Best Answer-推荐答案 strong>
问题是当对象试图进入引用 View 时,你撞到了顶部边界并导致了碰撞!物体从外部掉落并从您的引用 View 的顶部反弹。
所以你对碰撞边界的定义太简单了:
collisionBehavior.translatesReferenceBoundsIntoBoundary = YES;
没有。您必须手动设置碰撞边界。例如,从只是引用 View 的底部的边界开始,以便对象可以进入场景并从地板反弹,如下所示:
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)];
如果您想在第一次碰撞之后 更改为不同的封闭边界集,很好,但首先您必须让对象进入引用 View 。现在,您正在使用碰撞边界将其锁定。
关于ios - UIDynamicAnimator View 从引用范围之外进入,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/23252216/
|