2

有什么方法可以使用UIKit Dynamics将两个质量相互吸引,就像在自由空间中一样?

我知道默认情况下,重力行为就像重力指向地球一样。但这似乎只对一小部分行为有用。我能想到的唯一方法是给这两个项目巨大的质量并且没有初始重力矢量(但是将它们应用于UIGravityBehavior它们,错误地将它们添加到UIGravityBehavior?哈哈)。

self.animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];    

//first item with heavy mass.
self.dynamic = [[UIDynamicItemBehavior alloc] initWithItems:@[self.heavyCircle]];
self.dynamic.density = 1000000000;

self.gravity = [[UIGravityBehavior alloc] initWithItems:@[self.heavyCircle]];
self.gravity.gravityDirection = CGVectorMake(0, 0);

[self.animator addBehavior:self.gravity];
[self.animator addBehavior:self.dynamic];    

//second item with less mass
self.dynamic = [[UIDynamicItemBehavior alloc] initWithItems:@[self.smallCircle]];
self.dynamic.density = 10;
//also tried with a huge value here as well. 
//HUGE_VALF seems to make the app choke



self.gravity = [[UIGravityBehavior alloc] initWithItems:@[self.smallCircle]];
self.gravity.gravityDirection = CGVectorMake(0, 0);

[self.animator addBehavior:self.gravity];
[self.animator addBehavior:self.dynamic];

但这根本没有任何作用。:/ 我对 UIKit Dynamics 中的物理特性感到非常兴奋,我希望这种行为是可能的。

如果这对于 UIKit Dynamics 是不可能的,是否还有另一种同样集成的方式(保留交互性,并作为UIView/ Button/Whatever 发挥作用)?雪碧套件?

谢谢你的帮助!

4

1 回答 1

2

UIDynamicItemBehavior 密度不影响 UIGravityBehavior。

UIGravityBehavior 是一个恒定的加速度向量,应用于初始化它的所有项目。

要模拟两个项目之间的重力,您需要一个动态变化的力,该力取决于两个交互对象的位置。

要使用 UIGravityBehavior,您需要在每个动画步骤中动态更改方向和幅度。

幸运的是,UIDynamicBehavior 有一个在每个动画步骤上运行的action 块。

在该动作块中,您可以获取两个项目之间的向量以用作方向,并使用项目之间的距离的平方来改变力的大小。

这模拟了一个物体对另一个物体的作用力。要使力朝另一个方向移动,您需要第二个重力行为。

不幸的是,添加两个重力行为会导致此错误: Multiple gravity behavior per animator is undefined and may assert in the future

不过,您也许可以使用其他类型的动态行为来模拟重力。

于 2014-05-20T08:05:59.757 回答