OStack程序员社区-中国程序员成长平台

标题: ios - UIDynamicAnimator View 从引用范围之外进入 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-13 07:29
标题: ios - UIDynamicAnimator View 从引用范围之外进入

我想使用 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-推荐答案


问题是当对象试图进入引用 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/






欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) Powered by Discuz! X3.4