2014-03-05 52 views
2

有什麼辦法吸引兩個羣衆對方,就像在自由空間使用UIKit動力吸引兩個羣衆彼此w/UIKit動態

我知道默認情況下,重力行爲的作用就好像重力指向地球一樣。但這似乎只對一小部分行爲有用。我認爲這樣做的唯一方法是給兩個項目巨大的質量和沒有初始重力矢量(但是將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)? Sprite Kit?

感謝您的幫助!

回答

2

UIDynamicItemBehavior密度不會影響UIGravityBehavior。

UIGravityBehavior是一個應用於所有初始化項目的恆定加速度向量。

要模擬兩個項目之間的重力,需要一個動態更改的力量,該力量取決於兩個交互對象的位置。

要使用UIGravityBehavior,您需要動態更改每個動畫步驟的方向和大小。

幸運的是,UIDynamicBehavior的每個動畫步驟都有一個actionblock

在該動作塊中,您可以獲取兩個項目之間的矢量作爲方向,並使用項目之間距離的平方來改變力的大小。

模擬一個物體對另一個物體的作用力。要讓力量沿另一個方向行進,你需要第二種重力行爲。

不幸的是,在添加此錯誤兩個重力行爲的結果: Multiple gravity behavior per animator is undefined and may assert in the future

您可以模擬使用其它類型的動態行爲的嚴重性,雖然。

+0

這實際上適用於我的問題,因爲我只有一個質量吸引到另一個,另一個可能是一個固定點。 UISnapBehavior也做類似的事情。 –

+0

很酷,看起來有可能爲兩個對象案例做「真實」的引力,但這可能不是一個非常有效的方法。 :) – divergio

+0

@divergio,那他最後一個問題呢? –