2012-08-16 25 views
5

我用这个优秀教程开球一个小项目,我的工作涉及到物理学:应用Box2D的物理学的UIView与CALayer的

http://www.cocoanetics.com/2010/05/physics-101-uikit-app-with-box2d-for-gravity/

基本上,它会创建一个世界,应用物理学的B2D到你拥有的任何视图。非常简单,它的工作原理。但是,我试图通过使用CALayers来应用相同的逻辑,即我以编程方式创建图层,将它们添加到主视图并尝试对它们进行动画处理。

用于创建层的示例代码:

CALayer *layer = [CALayer layer]; 
layer.backgroundColor = [UIColor blackColor].CGColor; 
layer.frame = CGRectMake(50, 100, 30, 30); 
layer.name = @"square"; 
[self.view.layer addSublayer:layer]; 

而在股票的应用物理学:

CALayer *oneLayer = (CALayer *)b->GetUserData(); 
// y Position subtracted because of flipped coordinate system 
CGPoint newCenter = CGPointMake(b->GetPosition().x * PTM_RATIO, self.view.bounds.size.height - b->GetPosition().y * PTM_RATIO); 
oneLayer.position = newCenter; 
CGAffineTransform transform = CGAffineTransformMakeRotation(- b->GetAngle()); 
oneLayer.affineTransform = transform; 

请注意,我适应了仿射变换调用的CALayer类。

我检查并仔细检查了变量,数字似乎相符。我得到的是来自CALayer动画的奇怪反弹,以及来自UIView的完美动画。任何经验丰富的Box2D和UIKit来回答为什么会发生这种情况?

+0

你能否解释一下“怪异反弹” – erkanyildiz 2012-08-16 16:35:50

+0

此:http://youtu.be/OpTXuqIgiPE - 黑色是CALayer的,绿色是UIView.The CALayer在击中“地面”之前弹跳。一个原因导致我认为维度等。是正确的,这是因为CALayer最终会停止与底部接触地面的弹跳。 – hcabral 2012-08-16 17:30:07

回答

5

不像UIViews,CALayers有内置的隐式动画。每当您更改动画属性的值时,都会引入短动画。你必须包装在CATransaction你的代码,并禁止行动,以摆脱这种效果:

[CATransaction begin]; 
[CATransaction setDisableActions:YES]; // implicit animations get disabled 

CALayer *oneLayer = (CALayer *)b->GetUserData(); 
// y Position subtracted because of flipped coordinate system 
CGPoint newCenter = CGPointMake(b->GetPosition().x * PTM_RATIO, self.view.bounds.size.height - b->GetPosition().y * PTM_RATIO); 
oneLayer.position = newCenter; 
CGAffineTransform transform = CGAffineTransformMakeRotation(- b->GetAngle()); 
oneLayer.affineTransform = transform; 

[CATransaction commit]; 
+0

是的,就是这样! – hcabral 2012-08-16 19:54:23